我正在使用Emacs 25.1,以及最新的clojure-mode稳定版本。当打开clojure模式(不是像其他主要模式,如js2-mode)时,所有内容都严格对齐,在任何表单之前不允许有额外的空格。例如,
(def
last (fn ^:static last [x]
(if (next x)
(recur (next x))
(first x))))
我不能在每行的第一个非空白字符之前插入一个空格(插入后自动删除)。这种行为对我来说是不可取的。我尝试更改Clojure组中的变量,但似乎没有任何效果。如何关闭此行为?
答案 0 :(得分:1)
它并不清楚你的意思,但我怀疑你指的是这种方式 Clojure会将表单与let绑定等对齐,以便所有符号和 被约束的价值是对齐的,即
(let [a-val1 (something-1)
another-val (something-2)
final-col 12]
(do-some-stuff))
而不是
(let [a-val1 (something-1)
another val (something-2)
final-col 12]
(do-some-stuff))
如果是这种情况,那么您可以尝试一些事项。
自动查看变量clojure-align-forms
clojure-align-forms-automatic是一个定义的变量 “Clojure的-mode.el”。它的值是t原始值是零
如果该变量的值为
,则该变量作为文件局部变量是安全的 满足谓词'booleanp'。文档:如果非零,则自动垂直对齐某些表单。 自动表示它是作为缩进代码的一部分完成的。这个 适用于绑定形式('clojure-align-binding-forms'),cond 形式('clojure-align-cond-forms')和映射文字。例如, 选择一个地图,点击'M-x indent-for-tab-command'将对齐 像这样的价值观: {:某事 - 关键10 :key2 20}
您可以自定义此变量。
引入了此变量,或者更改了其默认值 clojure-mode包的5.1版。
您可能想要查看的另一个变量是clojure-indent-style
clojure-indent-style是'clojure-mode.el'中定义的变量。它的 值是':always-align'
如果该变量的值为
,则该变量作为文件局部变量是安全的 满足谓词'keywordp'。文档:用于函数表单和宏的缩进样式 形式。此变量配置了两种感兴趣的案例。
- 情况(A)是至少一个函数参数与函数名在同一行。
- 情况(B)相反(没有参数与函数名称在同一行)。请注意,宏的主体不受影响 这个变量,它总是由'lisp-body-indent'缩进(默认值 2)空格。
请注意,此变量配置函数表单的缩进 (和类似函数的宏),它不会影响已经使用的宏 特殊缩进规则。
此变量的可能值是指示如何操作的关键字 缩进功能表。
‘:always-align’ - Follow the same rules as ‘lisp-mode’. All args are vertically aligned with the first arg in case (A), and vertically aligned with the function name in case (B). For instance: (reduce merge some-coll) (reduce merge some-coll) ‘:always-indent’ - All args are indented like a macro body. (reduce merge some-coll) (reduce merge some-coll) ‘:align-arguments’ - Case (A) is indented like ‘lisp’, and case (B) is indented like a macro body. (reduce merge some-coll) (reduce merge some-coll)
您可以自定义此变量。
引入了此变量,或者更改了其默认值 clojure-mode包的5.2.0版本。
您可能还需要其他一些对齐/缩进变量 退房 - 尝试M-x customize-group clojure-mode和M-x customize-group 苹果酒浏览并查看是否有相关内容。你也可能会发现 与苹果酒文档网站相关的东西。特别是,看看 关于indentation
的手册部分更新编辑:基于评论中传达的OP的其他信息,我 决定编辑并扩展这个答案。我和我一样离开了最初的回应 觉得搜索和找到OP问题的其他人可能会有所帮助。然而, 通过评论中的其他信息,我不认为答案可以解决问题 OP实际问题,所以扩展了下面的答案,希望对此有所帮助。
某些Emacs模式更严格或更严格地执行代码格式 其他。对于像Clojure这样的各种常规语言尤其如此 (通常是大多数的lisps),语法是最小的和关于的规则 代码缩进更容易定义,并且往往有广泛的共识。
OP的情况更加复杂,因为他们正在使用a 预定义的Emacs配置 - 在本例中为Steve Purcell's emacs.d, 这是我最喜欢的预定义或罐装 Emacs配置之一。该 这些预定义配置的一个缺点是它们将打开和 定义Emacs编辑器的许多可选功能,可能是也可能不是 符合用户个人喜好。 Emacs倾向于保守派 新功能或增强功能的位置。通常,他们是残疾人 默认情况下,以避免影响新用户。这种保守方法的成本 随着时间的推移,Emacs可能看起来比较原始或功能较少 其他编辑者希望启用某些此类行为的新用户 默认。通过使用固定配置,您可以获得一个人的首选设置 无需经历漫长而艰难的过程 你自己。缺点是当它与用户不匹配时 期望,用户没有知识或理解 变化,很难得到帮助,因为其他人不了解/不了解 他们的配置已经是什么。
作为一个例子,当我使用这些预定义的设置时,如何使问题复杂化 最后看了一下Purcell配置,它使用了ELPA包 aggressive-indent ,它强制执行更严格的缩进规则 很好的是这个包而不是clojure模式,这是强制执行刚性 缩进规则。
OP提到他们担心这种自动格式化 在为其他项目和问题做出贡献时会导致问题 自动格式化使代码看起来像有更多的变化 实际上是由于版本控制拾取空白而发生的 调整。此问题主要是由于使用选项卡导致的差异 和空间。在很大程度上,这些问题在大多数情况下都不那么频繁 版本控制系统可以配置为忽略空格更改。
在这种情况下,我建议现在不采取任何措施,因为不存在真实情况 问题。继续使用预制配置并继续询问 问题,但也花了一些时间来学习和理解 组态。在某些时候,一旦你对Emacs感到满意,你很可能会 想要重新配置系统,以更好地满足您自己的个人品味。这样 时间,你将更好地了解Emacs,它有各种选择 以及不同模式的工作方式。当你遇到特定的实际问题时 你无法解决,然后发布另一个问题。很可能就在那时,你 将有具体的信息,有人将能够提供具体的信息 救命。