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

时间:2017-02-14 09:25:21

标签: emacs

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

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

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

1 个答案:

答案 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'

     

如果该变量的值为
,则该变量作为文件局部变量是安全的   满足谓词'k​​eywordp'。

     

文档:用于函数表单和宏的缩进样式   形式。此变量配置了两种感兴趣的案例。

     
      
  • 情况(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,它有各种选择 以及不同模式的工作方式。当你遇到特定的实际问题时 你无法解决,然后发布另一个问题。很可能就在那时,你 将有具体的信息,有人将能够提供具体的信息 救命。