您可以将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-syntax 或 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")