是否可以在clojure模式下关闭强制垂直对齐



我使用的是Emacs 25.1,它是clojure模式的最新稳定版本。当clojure模式(而不是像js2模式这样的其他主要模式)打开时,所有内容都是严格对齐的,在任何表单之前都不允许有额外的空白。例如,

(def
last (fn ^:static last [x]
(if (next x)
(recur (next x))
(first x))))

我不能在每行的第一个非空白字符之前插入空格(插入后自动删除)。这种行为对我来说是不可取的。我尝试更改Clojure组中的变量,但似乎什么都不起作用。如何关闭此行为?

你的意思还不完全清楚,但我怀疑你指的是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自动对齐表单

clojure align forms automatically是中定义的变量"clojure mode.el"。其值为t原始值为nil

如果该变量的值
满足谓词"booleanp",则该变量作为文件本地变量是安全的。

文档:如果非零,则自动垂直对齐某些表单。自动意味着它是作为缩进代码的一部分完成的。这适用于绑定形式('clojure-align-binding-forms'),适用于cond形式('clojure-align-cond-forms')和映射文字。例如,选择一个地图,点击"选项卡命令的M-x缩进"将对齐值如下:{:某个键10:key2 20}

您可以自定义此变量。

此变量是在中引入的,或其默认值已更改clojure模式包的5.1版本。

您可能想要查看的另一个变量是clojure缩进样式

clojure缩进样式是在"clojure mode.el"中定义的变量值为":始终对齐">

如果该变量的值
满足谓词"关键字p",则该变量作为文件本地变量是安全的。

文档:用于函数窗体和宏的缩进样式表格。此变量配置了两种感兴趣的情况。

  • Case(A)是指至少有一个函数参数与函数名称位于同一行
  • 情况(B)正好相反(没有参数与函数名位于同一行)。请注意,宏主体不受这个变量,它总是缩进'lispbodyindent'(默认值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模式包的5.2.0版本。

您可能还需要其他一些对齐/缩进变量检查-尝试M-x自定义组clojure模式和M-x自定义分组苹果酒浏览,看看是否有相关内容。你可能还会发现苹果酒文档网站上的相关内容。特别是,看看关于压痕的手册部分

更新版:根据OP在评论中传达的其他信息,我决定编辑并扩展这个答案。我留下了原来的回复觉得它可能对搜索并找到OP问题的其他人有用。然而有了评论中的其他信息,我认为答案没有解决OP的实际问题,所以我在下面扩展了答案,希望能有所帮助。

有些Emacs模式比其他。对于像Clojure这样的各种正则语言,情况尤其如此(一般来说,大多数lisp)当语法最小时代码缩进更容易定义,并且往往具有广泛的共识。

OP的情况更加复杂,因为他们正在使用预定义的Emacs配置-在本例中是Steve Purcell的Emacs.d,这是我最喜欢的预定义或罐装Emacs配置之一。这个这些预定义配置的一个缺点是,它们将打开并且定义Emacs编辑器的许多可选功能,这些功能可能是也可能不是符合用户个人偏好。Emacs的保守倾向各不相同当涉及到新功能或增强功能时的位置。通常,他们是残疾人默认情况下,以避免影响新用户。这种保守方法的成本随着时间的推移,与其他编辑器到新用户,这些新用户希望通过违约通过使用固定配置,您可以获得一个人的首选设置而不必经历通常漫长而困难的过程你自己缺点是当它与用户的预期,用户没有知识或理解变化,很难得到帮助,因为其他人不知道/不理解他们的配置已经是什么。

例如,当我最后一次查看Purcell配置时,它使用了ELPA包激进缩进,它强制执行更严格的缩进规则,并且可以好吧,是这个包,而不是clojure模式,它强制执行刚性缩进规则。

OP提到,他们担心这种自动格式化在参与其他项目时引发问题自动格式化,使代码看起来更改的次数多于实际发生的原因是版本控制占用了空白调整。这个问题主要是由于选项卡的使用而产生的差异和空间。在很大程度上,这类问题现在不像大多数人那样频繁版本控制系统可以被配置为忽略空白更改。

在这种情况下,我的建议是现在什么都不做,因为没有真正的问题。继续使用固定配置并继续询问问题,但也要花一些时间尝试学习和理解配置在某个时刻,一旦你对Emacs感到满意,你很可能想要重新配置系统以更好地满足您的个人品味。由此随着时间的推移,您将更好地了解Emacs,以及它所具有的各种选项以及不同模式的工作方式。当你遇到具体的实际问题时你无法解决,然后再发布一个问题。很可能在那一点上,你将有具体的信息,并且有人能够提供具体的帮助

最新更新