有效的Clojure压头

有效的Clojure压头,clojure,editor,indentation,Clojure,Editor,Indentation,我正在寻找一个编辑器/命令行程序,它正确地(IMHO)缩进Clojure代码,将第三个和后续元素与第二个元素对齐: (let [foo (fun arg1 arg2) bar (doto (Baz.) (.setProp abc123)) [v1 v2] (fun2) [v3 v4] (fun3)] (xyzzy 42)) 我曾经尝试过IntelliJ的La Clojure,其中有“按第

我正在寻找一个编辑器/命令行程序,它正确地(IMHO)缩进Clojure代码,将第三个和后续元素与第二个元素对齐:

(let [foo (fun arg1
               arg2)

      bar (doto (Baz.)
                (.setProp abc123))

      [v1 v2] (fun2)

      [v3 v4] (fun3)]
  (xyzzy 42))
我曾经尝试过IntelliJ的La Clojure,其中有“按第二个元素对齐Clojure表单”(不按第二个元素对齐)、VimClojure、emacs(弄乱了
[v3 v4]
部分的缩进)、Netbeans中的Enclojure(不按第二个元素对齐)和Eclipse中的逆时针(不按第二个元素对齐)。在每种情况下,我都使用最新版本的软件

如有必要,我可以在编辑器外(在命令行上)运行美化器

这是Aquamacs的输出。注意“级联”(make day面板)调用:


据我所知,当前clojure模式的缩进与您想要的一样,只是它将doto处理为特殊的(也就是说,它从第三种形式开始缩进,以使“目标”更加突出)

使用marmalade的clojure模式在我的emacs 24上的缩进sexp的输出:

(let [foo (fun arg1
               arg2)

      bar (doto (Baz.)
            (.setProp abc123))

      [v1 v2] (fun2)

      [v3 v4] (fun3)]
  (xyzzy 42))
我认为你要么已经打破了clojure模式,要么aquamacs又变得不同和困难了。我真的建议在OSX上使用标准Gnu emacs——只要您将meta映射到command以外的其他东西,就可以在标准emacs中使用大多数简单的标准OSX键组合(command-c、command-v、command-s等)

附录:大代码块的输出(注意make day面板调用的正确位置):


据我所知,如果你在缩进延续的同一行上开始一个全新的sexp,Emacs压头不明白会发生什么,这就是你上面的
let
所做的。你也看到了类似的问题

(if (< 1 (- 3
            1) 3
            4))

正如你所看到的,缩进很好。因此,我认为,在某个时候,必须有人找出如何为这种情况更新Emacs压头,这将比让其他编辑器达到Emacs的级别要容易得多。如果让你感到困扰的话,也许那个人应该是你——我想是开源的魔力和负担。

当你从
lispwords
中删除
doto
时,VimClojure会按照你想要的方式缩进(如果我理解正确的话)

setlocal lispwords-=doto
缩进方式与Joost文章示例中的Emacs相同:

(let [foo (fun arg1
               arg2)

      bar (doto (Baz.)
            (.setProp abc123))

      [v1 v2] (fun2)

      [v3 v4] (fun3)]
  (xyzzy 42))

如果你问我的话,很好。根据我的经验,它比IDEA、Sublime Text或Netbeans更有效。如果您不是Vim/Emacs用户,那么值得一看。它仍处于早期阶段,但显示出很多希望。它的设计考虑到了Clojure。

我要试试。它声称是OsX GUI的常规GNU Emacs。谢谢我可以接受它处理
doto
@Ralph emacs在osx上本机工作的方式,只需从cvs或git repo和build中查看它即可。@HamzaYerlikaya:是的。我经常在终端窗口中使用它。我只是想要一个作为本机应用程序运行的版本,这样我就可以使用Spotlight启动它。@Joost:仍然有级联
let
绑定。我从(23.3版)安装了Emacs,从Marmalade存储库安装了clojure模式。如果我将分解与函数调用分开(
[^JPanel…](make day panel…
),如果格式正确。@Ralph这就是我的本意,如果你从cvs/git repos编译,你得到的是一个独立的应用程序,就像任何其他os x应用程序一样。也可以从spotlight开始。我认为让Emacs执行“正确”缩进比在许多其他编辑器中更容易,因为大多数其他编辑器可能会使用某种形式的模式匹配来查找s表达式,而在Emacs Lisp中,您可以编写“真实”解析器。我相信,编写一个匹配任意嵌套括号的正则表达式是不可能的。Clojure的解析器在Lisp中应该不会太难:-)。这正是我说的?我拿出了我的O'Reilly书《编写GNU Emacs扩展》。现在我只需要读一下:-)。我从1983年开始使用Unix时就开始使用vi,但我只知道编辑像/etc/hosts:-)这样的东西。我有两本关于vi(&vim)的O'Reilly书,但都没读过。也许是时候了。我知道vim是一个与1983年的vi截然不同的编辑。
(let [([x
        y
        z] (foo))
      ([a
        b
        c] (bar))]
  ...)
setlocal lispwords-=doto
(let [foo (fun arg1
               arg2)

      bar (doto (Baz.)
            (.setProp abc123))

      [v1 v2] (fun2)

      [v3 v4] (fun3)]
  (xyzzy 42))