3

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

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

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

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

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

4

2 回答 2

13

您可以设置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)

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

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

对于有经验的 Lisper,两个空格巧妙地表示该表达式是一种特殊形式,其两个空格缩进的子形式将按顺序计算。当你使用define-syntaxor创建你自己的特殊表单defmacro时,你可以告诉 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")
于 2012-09-15T00:20:13.993 回答
0

Variety in indentation styles is a source of problems. So while Emacs modes generally try to support most existing indentation styles, they don't necessarily make it easy to use a different style, since that would encourage people to invent new styles. You'll generally be better off learning to live with the "standard" indentation style: that will help you read other people's code and help other people read your code.

于 2012-09-15T02:29:06.247 回答