如何使emacs正确缩进if-then-else在elisp中构造

时间:2010-04-15 02:12:52

标签: emacs clojure

当我在emacs lisp中缩进if-then-else构造时,else块不会正确缩进。我得到的是:

(defun swank-clojure-decygwinify (path)
  "Convert path from CYGWIN UNIX style to Windows style"
  (if (swank-clojure-cygwin)
      (replace-regexp-in-string "\n" "" (shell-command-to-string (concat "cygpath -w " path)))
    (path)))

其他form不与then表单在同一级别缩进。有没有明显的方法来解决这个问题?

4 个答案:

答案 0 :(得分:17)

这是正确的缩进。手册中的引用:

  

“else”一词不是用Lisp代码写的;另一部分   `if'表达式出现在then-part之后。在写的Lisp中,   else-part通常是在自己的行上开始编写的   缩进小于当时的部分:

 (if TRUE-OR-FALSE-TEST
     ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE
   ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-FALSE)

例如,当您以通常的方式评估消息时,以下if表达式会打印消息4 is not greater than 5!

 (if (> 4 5)                               ; if-part
     (message "4 falsely greater than 5!") ; then-part
   (message "4 is not greater than 5!"))   ; else-part

请注意,不同级别的缩进使其变得容易 将then-part与else-part区分开来。 (GNU Emacs有几个 自动缩进if表达式的命令。 *注意 GNU Emacs帮助您键入列表:键入列表。)

这是一个功能,而不是一个错误: - )

答案 1 :(得分:8)

我没有方便的相关文档,但这似乎做你想要的:

(put 'if 'lisp-indent-function nil)

另外,你误用了“正确”这个词;根据定义,但emacs缩进是“正确的”:)

答案 2 :(得分:5)

默认样式适用 - 对于Emacs Lisp。对于Common Lisp和其他类型的Lisp,“else”子句应该在“then”子句下面对齐。要获得Common Lisp的修正,你必须做这样的事情:

(set (make-local-variable lisp-indent-function)
     'common-lisp-indent-function)

要自动执行此操作,您可以执行以下操作:

(add-hook 'lisp-mode-hook
          '(lambda ()
             (set (make-local-variable lisp-indent-function)
                  'common-lisp-indent-function))))

但请注意,Lisp-Emacs交互包(如Slime)可能会覆盖缩进行为,在这种情况下,上述操作可能无效。以上内容应该适用于基本的Emacs。

答案 3 :(得分:0)

让自己相信Elisp是一个方案并使用progn。这会分隔then和else表达式,但会在同一列中缩进它们:

boxplot(Sepal.Length ~ Species,  data = iris)
points(seq_along(levels(iris$Species)), with(iris, tapply(Sepal.Length, Species, mean)), col = "red")
相关问题