首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs方案(方案-模式)缩进

Emacs方案(方案-模式)缩进
EN

Stack Overflow用户
提问于 2012-09-15 05:27:38
回答 2查看 1.9K关注 0票数 3

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

代码语言:javascript
复制
(string-append
 "foo "
 "bar "
 "baz")

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

代码语言:javascript
复制
(string-append
  "foo "
  "bar "
  "baz")

对于Emacs中的大多数模式来说,这很容易更改,但我还没有想出如何在方案中这样做。我也看过scheme.el的源代码,虽然里面有做各种奇特对齐的逻辑,但我还没有找到定制“标准缩进”的简单方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-15 08:20:14

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

Lisp风格的语言遵循与其他语言略有不同的缩进原则。当S表达式的第一个元素单独在左括号之后时,惯例是将其余元素排列在同一列中开始:

代码语言:javascript
复制
(first-item
 second-item
 third-item fourth-item fifth-item
 sixth-item)

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

代码语言:javascript
复制
(first-item second-item
            third-item fourth-item fifth-item
            sixth-item)

此约定适用于非特殊形式的sexps,包括函数调用,如对string-append的调用。特殊形式,即由求值器和编译器专门解释的sexps,其缩进略有不同。提供要计算的表达式的表单将缩进两个空格:

代码语言:javascript
复制
(lambda (value)
  (display value)
  (send-eof))

对于经验丰富的Lisper来说,两个空格巧妙地表示表达式是一种特殊的表单,它的两个空格缩进的子表单将按顺序计算。当您使用define-syntaxdefmacro创建自己的特殊表单时,您可以告诉Emacs以相同的方式缩进它们的子表单:

代码语言:javascript
复制
;; 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调用的缩进方式,我建议切换到第二种形式,它会自动将字符串进一步向右缩进:

代码语言:javascript
复制
(string-append "foo "
               "bar "
               "baz")
票数 13
EN

Stack Overflow用户

发布于 2012-09-15 10:29:06

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12432217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档