【问题标题】:How to make emacs properly indent if-then-else construct in elisp如何使emacs在elisp中正确缩进if-then-else结构
【发布时间】:2010-04-15 02:12:51
【问题描述】:

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

(defun swank-clojure-decygwinify (路径) “将路径从 CYGWIN UNIX 样式转换为 Windows 样式” (如果(swank-clojure-cygwin) (replace-regexp-in-string "\n" "" (shell-command-to-string (concat "cygpath -w " path))) (小路)))

where else 形式的缩进与 then 形式不同。有没有明显的方法来解决这个问题?

【问题讨论】:

  • 这是正确的缩进。
  • 之所以会这样缩进的原因是因为“else形式”实际上包含了“then”表达式之后的所有表达式,并且他们all在那个级别缩进。当考虑到if 语句时,默认缩进是有意义的。

标签: emacs clojure


【解决方案1】:

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

“else”这个词没有写在 Lisp 代码中; an 的 else 部分 'if' 表达式出现在 then 部分之后。在书面 Lisp 中, else-part 通常写成从它自己的一行开始,并且是 缩进小于 then 部分:

 (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 部分和 else 部分。 (GNU Emacs 有几个 自动正确缩进if 表达式的命令。 *笔记 GNU Emacs 帮助您键入列表:键入列表。)

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

【讨论】:

    【解决方案2】:

    我手头没有相关文档,但这似乎可以满足您的要求:

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

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

    【讨论】:

    • 人们经常混淆“正确”和“以我刚刚提出的方式”的概念
    【解决方案3】:

    默认样式是正确的——对于 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 中工作。

    【讨论】:

    • 很好奇这不是 lisp-mode 的默认值(或者至少是 common-lisp-mode 的默认值,尽管我现在看到这只是 lisp-mode 的别名)
    【解决方案4】:

    让自己相信 Elisp 是一个 Scheme 并使用 progn。这分隔了 then 和 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)))
        (progn
          (path))))
    

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多