【问题标题】:Emacs scheme (scheme-mode) indentationEmacs 方案(方案模式)缩进
【发布时间】:2012-09-14 21:27:37
【问题描述】:

默认情况下,Emacs 中的方案模式使用一个空格缩进格式化代码:

(string-append
 "foo "
 "bar "
 "baz")

我希望它至少是两个空格,即:

(string-append
  "foo "
  "bar "
  "baz")

对于 Emacs 中的大多数模式,这很容易更改,但我还没有弄清楚如何为 scheme 进行更改。我也查看了 scheme.el 的源代码,虽然其中有逻辑可以进行各种花哨的对齐,但我还没有找到自定义“标准缩进”的简单方法。

【问题讨论】:

    标签: emacs scheme indentation auto-indent


    【解决方案1】:

    您可以将lisp-indent-offset 设置为 2,但您几乎可以肯定不想这样做,除非您真的知道自己在做什么。

    Lisp 风格的语言遵循与其他语言略有不同的缩进理念。当 S 表达式的第一个元素在左括号之后是单独的时,约定是将其余元素排列在同一列中:

    (first-item
     second-item
     third-item fourth-item fifth-item
     sixth-item)
    

    当第二个元素与第一个元素在同一行时,惯例是将以下元素与第二个元素对齐:

    (first-item second-item
                third-item fourth-item fifth-item
                sixth-item)
    

    此约定适用于非特殊形式的sexp,包括函数调用,例如对string-append 的调用。由评估器和编译器专门解释的特殊形式,sexps,遵循稍有不同的缩进。提供表达式以进行评估的表单将缩进两个空格:

    (lambda (value)
      (display value)
      (send-eof))
    

    对于有经验的 Lisper,两个空格巧妙地表示该表达式是一种特殊形式,其两个空格缩进的子形式将按顺序计算。当您使用 define-syntaxdefmacro 创建自己的特殊表单时,您可以告诉 Emacs 以同样的方式缩进它们的子表单:

    ;; define a CL-style `unless` macro...
    (defmacro unless (test &rest forms)
      `(or ,test (progn ,@forms)))
    
    ;; ...and tell emacs to indent its body forms with two spaces
    ;; (unless (= value 0)
    ;;   (display value)
    ;;   (send-eof))
    (put 'unless 'lisp-indent-function 2)
    

    更改缩进级别会向读者发送关于正在发生的事情的错误信号,从而影响您的代码。如果你不喜欢 Emacs 对string-append 的调用缩进,我建议切换到第二种形式,它会自动将字符串进一步向右缩进:

    (string-append "foo "
                   "bar "
                   "baz")
    

    【讨论】:

    • 感谢您的详尽回答。我测试了你的 lambda 示例,然后用两个空格缩进。看起来我需要改变我的习惯(目前主要是基于 clojure)。
    • 另一个观察;在使用 Kawa(例如 Android 应用程序)创建 java/scheme 混合体时,两种标准缩进形式的方案看起来都非常糟糕,因为.really.long.statements。这会导致缩进一个空格,或者编辑器窗口左侧的大部分内容都是空格。根据当前的方案约定,看起来并不容易修复。
    • 我没有使用 Kawa 和类似的经验,但我相信传统的答案是在这种情况下使用一个空格缩进。到那时,查看其他人的源代码以找出在该特定社区中被接受为最佳实践的方法可能是个好主意。
    • 是的,我现在正在试验彩虹定界符和 s 表达式的颜色装箱,以使其更漂亮而不会弄乱缩进。
    【解决方案2】:

    缩进样式的多样性是问题的根源。因此,尽管 Emacs 模式通常会尝试支持大多数现有的缩进样式,但它们并不一定会使使用不同的样式变得容易,因为这会鼓励人们发明新的样式。通常,您最好学习使用“标准”缩进样式:这将帮助您阅读其他人的代码并帮助其他人阅读您的代码。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2016-10-29
      • 2014-03-10
      相关资源
      最近更新 更多