Mar*_*ahl 2 emacs scheme indentation auto-indent
默认情况下,Emacs中的scheme模式使用一个空格缩进格式化代码:
(string-append
"foo "
"bar "
"baz")
Run Code Online (Sandbox Code Playgroud)
我希望它至少有两个空格,即:
(string-append
"foo "
"bar "
"baz")
Run Code Online (Sandbox Code Playgroud)
对于Emacs中的大多数模式,这很容易改变,但我还没想出如何为方案做这件事.我也查看了scheme.el的源代码,虽然在那里有用于进行各种奇特对齐的逻辑,但我还没有找到一种简单的方法来自定义"标准缩进".
use*_*342 11
你可以设置lisp-indent-offset为2,但你几乎肯定不想这样做,除非你真的知道你在做什么.
Lisp风格的语言遵循与其他语言略有不同的缩进理念.当S-expression的第一个元素在开括号后单独出现时,约定是将其余元素排成一行以在同一列中开始:
(first-item
second-item
third-item fourth-item fifth-item
sixth-item)
Run Code Online (Sandbox Code Playgroud)
当第二个元素与第一个元素位于同一行时,约定是将以下元素与第二个元素对齐:
(first-item second-item
third-item fourth-item fifth-item
sixth-item)
Run Code Online (Sandbox Code Playgroud)
此约定适用于非特殊形式的性别,包括函数调用,如调用string-append.特殊形式,由评估者和编译器特别解释的性别,遵循略有不同的缩进.提供要评估的表达式的表单将缩进两个空格:
(lambda (value)
(display value)
(send-eof))
Run Code Online (Sandbox Code Playgroud)
对于经验丰富的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)
Run Code Online (Sandbox Code Playgroud)
更改缩进级别会向读者发送有关正在发生的事情的错误信号,从而减损您的代码.如果您不喜欢Emacs如何缩进您的调用string-append,我建议切换到第二个表单,它会自动将字符串进一步缩进到右侧:
(string-append "foo "
"bar "
"baz")
Run Code Online (Sandbox Code Playgroud)