如何美化lisp源代码?

zei*_*tue 9 scheme clojure common-lisp

我的代码在这种语言中很多很长,如下所示

(defn check-if-installed[x] (:exit(sh "sh" "-c" (str "command -v " x " >/dev/null 2>&1 || { echo >&2 \"\"; exit 1; }"))))
Run Code Online (Sandbox Code Playgroud)

要么

(def Open-Action (action :handler (fn [e] (choose-file :type :open :selection-mode :files-only :dir ListDir :success-fn (fn [fc file](setup-list file)))) :name "Open" :key "menu O" :tip "Open spelling list"))
Run Code Online (Sandbox Code Playgroud)

这太可怕了.我想这样格式化

(if (= a something)
    (if (= b otherthing)
        (foo)))
Run Code Online (Sandbox Code Playgroud)

如何以更好的方式美化源代码?

Joh*_*nts 5

真正的答案取决于您是否愿意自己插入新行.一旦你将它分解成线条,许多系统都可以用惯用的方式缩进线条.

如果你希望手动插入它们,球拍规定,做一些你想要什么"漂亮打印":

#lang racket

(require racket/pretty)

(parameterize ([pretty-print-columns 20])
  (pretty-print '(b aosentuh onethunoteh (nte huna) oehnatoe unathoe)))
Run Code Online (Sandbox Code Playgroud)

==>

'(b
  aosentuh
  onethunoteh
  (nte huna)
  oehnatoe
  unathoe)
Run Code Online (Sandbox Code Playgroud)

...但我是第一个承认在正确位置插入换行符很难的人,因为换行符的选择与你希望人们如何阅读代码有很大关系.

  • "在正确的位置插入换行符+1很难,因为换行符的选择与人们阅读代码的方式有很大关系" (3认同)

Amu*_*umu 2

现在你可以使用Srefactor 包来做到这一点。

一些演示:

可用命令:

  • srefactor-lisp-format-buffer:格式化整个缓冲区
  • srefactor-lisp-format-defun:当前defun光标所在格式
  • srefactor-lisp-format-sexp:当前sexp光标所在的格式。
  • srefactor-lisp-one-line:将当前同级别的sexp变成一行;使用前缀参数,递归地将所有内部 sexp 变成一行。

方案变体虽然不像 Emacs Lisp 和 Common Lisp 那样完善,但适用于简单和小型的 sexp。如果有任何问题,请提交问题报告,我很乐意修复。