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

Mad*_*bat 11 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)))

其他形式没有缩进到与当时形式相同的级别.有没有明显的方法来解决这个问题?

Boz*_*sov 17

这是适当的缩进.手册中的引用:

"else"这个词不是用Lisp代码写的; "if"表达式的else部分位于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)
Run Code Online (Sandbox Code Playgroud)

例如,以下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
Run Code Online (Sandbox Code Playgroud)

请注意,不同级别的缩进可以轻松区分then-part和else-part.(GNU Emacs有几个命令可以自动缩进if表达式.*注意GNU Emacs帮助您键入列表:键入列表.)

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


off*_*by1 8

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

(put 'if 'lisp-indent-function nil)
Run Code Online (Sandbox Code Playgroud)

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

  • 人们经常混淆"正确"和"以我刚刚提出的方式"的概念 (4认同)

Joh*_*n V 5

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

(set (make-local-variable lisp-indent-function)
     'common-lisp-indent-function)
Run Code Online (Sandbox Code Playgroud)

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

(add-hook 'lisp-mode-hook
          '(lambda ()
             (set (make-local-variable lisp-indent-function)
                  'common-lisp-indent-function))))
Run Code Online (Sandbox Code Playgroud)

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