Emacs方案(方案模式)缩进

时间:2012-09-14 21:27:38

标签: emacs scheme indentation auto-indent

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

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

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

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

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

2 个答案:

答案 0 :(得分:11)

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

Lisp风格的语言遵循与其他语言略有不同的缩进理念。当S-expression的第一个元素在开括号后单独出现时,约定是将其余元素排成一行以在同一列中开始:

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

当第二个元素与第一个元素位于同一行时,约定是将以下元素与第二个元素对齐:

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

此约定适用于非特殊形式的性别,包括调用string-append等函数调用。特殊形式,由评估者和编译器特别解释的性别,遵循略有不同的缩进。提供要评估的表达式的表单将缩进两个空格:

(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")

答案 1 :(得分:0)

缩进样式的多样性是问题的根源。因此,虽然Emacs模式通常会尝试支持大多数现有的缩进样式,但它们并不一定能够轻松地使用不同的样式,因为这会鼓励人们发明新的样式。你通常会更好地学会遵守"标准"缩进样式:这将帮助您阅读其他人的代码并帮助其他人阅读您的代码。