Emacs方案(方案模式)缩进

Emacs方案(方案模式)缩进,emacs,scheme,indentation,auto-indent,Emacs,Scheme,Indentation,Auto Indent,默认情况下,Emacs中的scheme模式使用一个空格缩进格式化代码: (string-append "foo " "bar " "baz") 我希望它至少有两个空格,即: (string-append "foo " "bar " "baz") 对于Emacs中的大多数模式来说,这很容易更改,但我还没有弄清楚如何为scheme更改。我也查看了scheme.el的源代码,虽然其中有用于进行各种奇特对齐的逻辑,但我还没有找到一种定制“标准缩进”的简单方法。您可以将lisp in

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

(string-append
 "foo "
 "bar "
 "baz")
我希望它至少有两个空格,即:

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

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

您可以将
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,包括对
stringappend
的调用等函数调用。特殊的形式,由计算器和编译器专门解释的sexps,遵循稍微不同的缩进。提供要计算的表达式的表单将缩进两个空格:

(λ(值)
(显示值)
(发送eof)
对于有经验的Lisper,两个空格微妙地表示表达式是一种特殊形式,其两个空格缩进的子窗体将按顺序求值。当您使用
define syntax
defmacro
创建自己的特殊表单时,您可以告诉Emacs以相同的方式缩进其子表单:

;;定义CL样式“除非”宏。。。
(测试和休息表格)
`(或,测试(progn,@forms)))
;; ...并告诉emacs使用两个空格缩进其主体形状
;; (除非(=值0)
;(显示值)
(发送eof)
(put“除非”lisp缩进函数2)
更改缩进级别将向读者发送错误的信号,告知正在发生的事情,从而降低代码的质量。如果您不喜欢Emacs将调用缩进到
string append
,我建议切换到第二种形式,它将自动将字符串进一步缩进右侧:

(字符串附加“foo”
“酒吧”
“baz”)

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

感谢您详细的回答。我测试了lambda示例,然后它用两个空格缩进。看起来我需要改变我的习惯(到目前为止大部分都是基于clojure);当使用Kawa(例如Android应用程序)创建java/scheme混合时,scheme的两种标准缩进形式看起来都非常糟糕,这是由于.to.really.long.statements造成的。这会导致一个空格缩进,或者编辑器窗口的左半部分大部分是空白。根据目前的方案惯例,看起来不太容易修复。我没有Kawa和类似的经验,但我相信传统的答案是在这种情况下使用一个空格缩进。在这一点上,看一看其他人的源代码,找出那个特定社区中被接受的最佳实践可能是一个好主意。是的,我现在正在试验彩虹分隔符和s表达式的颜色框,以便在不影响缩进的情况下使它更漂亮。