有没有一个在线工具可以像JSON一样自动缩进和格式化Clojure代码?

20

有很多在线工具可以将JSON文本转换成格式化和缩进良好的格式。

一些工具甚至可以创建漂亮的树状结构:http://jsonviewer.stack.hu/

我们是否有类似于Clojure代码的工具?

或者至少有自动缩进的工具吗?

如果我拥有的文本是这样的:

(defn prime? [n known](loop [cnt (dec (count known)) acc []](if (< cnt 0) (not (any? acc))
(recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

它应该自动缩进成这样:

(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0) (not (any? acc))
    (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

1
如果您仍然感兴趣的话,您可能想要查看我编辑过的答案。 - Leon Grapenthin
4个回答

25

请看https://github.com/xsc/rewrite-clj,它是全新的,能够完美解决你的问题。

编辑:我仍然得到了此帖子的赞同。我相信我找到了更好的解决方案:你可以轻松地使用clojure.pprint利用code-dispatch而不必使用外部库。

(clojure.pprint/write '(defn prime? [n known](loop [cnt (dec (count known)) acc []](if (< cnt 0) (not (any? acc))                                                                                                 (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))]))))) 
  :dispatch clojure.pprint/code-dispatch)
=> 
(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0)
      (not (any? acc))
      (recur
        (dec cnt)
        (concat acc [(zero? (mod n (nth known cnt)))])))))

如果您想在整个文件上产生类似于pprint的影响,请使用zprint,如此答案所示。 - Jason Basanese
@JasonBasanese 为什么我不能只使用pprint? - Leon Grapenthin
使用lein工具会更加容易,我认为pprint不支持以文件作为输入。 - Jason Basanese
pprint解决方案适用于少量代码行,如果您有更多的代码行,它实际上会尝试编译大型函数,并给出函数过大异常。 - Ravi Bhanushali

7
我不知道有任何在线服务可以做到这一点,但是有Clojure库可用于此目的。clojure.pprint随Clojure一起提供(关键函数是clojure.pprint/pprint);Brandon Bloom的fipp是一种显着更快的替代品。
请注意,两者都不太可能像使用Emacs的程序员那样格式化代码;然而,它们足够接近以便有用,并且对于文字数据(不打算解释为代码),它们很可能符合人类标准。

谢谢。你几乎回答了我所有关于Clojure的问题! - Amogh Talpallikar
fipps 的主要目标是实现高性能打印,而非代码重构,仅供参考。 - bhurlow

5

针对这个问题 - 现在有一个名为http://pretty-print.net的网站,它可以用于美化EDN和Clojure代码。


代码有问题 :(在 JavaScript 控制台中只打印“Uncaught Invalid match arg: /^#/",并没有渲染任何内容。 - dsvensson
@dsvensson - 对不起,那个ClojureScript版本在服务器上运行的Leiningen版本有点问题。我已经将其移动到自己的专用服务器上并解决了这个问题。 - comamitc
链接已失效。 - Andrew Au
1
幸运的是,它仍然存在于Wayback上:https://web.archive.org/web/20170707155649/http://pretty-print.net:80/ - Squish

1

现在有https://github.com/weavejester/cljfmt可以用于这个目的。

说明

将其添加到您的Leiningen插件中:

:plugins [[lein-cljfmt "0.6.1"]]

然后,要自动格式化项目中的所有代码:
lein cljfmt fix

示例

您的示例代码将变为:

(defn prime? [n known] (loop [cnt (dec (count known)) acc []] (if (< cnt 0) (not (any? acc))
                                                                  (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

添加了一些换行并重新格式化后:

(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0) (not (any? acc))
        (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接