当我在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表单在同一级别缩进。有没有明显的方法来解决这个问题?
答案 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")