外部Lisp代码缩进工具

5
我有一些类似于Lisp/Scheme的代码需要缩进。我搜索了像GNU indent这样的工具,但是我找不到任何命令行实用程序/脚本。虽然有很多可用于C/C++/Java的工具,但我无法找到任何用于Lisp/Scheme的工具。如果有这样的缩进工具,请问有人能告诉我吗?
谢谢。
4个回答

3
你可以使用批处理模式的emacs。例如,你可以创建一个名为indent.el的文件。
(defun my/indent-file (fPath)
  (let ((buffer (find-file fPath)))
    (message (concat "indenting file " fPath))
    (indent-region (point-min) (point-max))
    (save-buffer)
    (kill-buffer buffer)))

(mapcar 'my/indent-file argv)

然后以这种方式调用emacs来对一堆文件进行缩进(注意,对于任何语言emacs都能识别并知道如何缩进):

emacs --load indent.el --batch MY_LISP_FILES

请参考此页面,了解有关使用emacs进行批处理的惯用方式的更多信息。 编辑 以下是一个一行命令,仅适用于一个文件,但不使用argv变量(请注意:参数顺序很重要):
emacs --batch MY_FILE --eval '(indent-region (point-min) (point-max))' -f 'save-buffer' 

我尝试了这个,但出现了错误 Symbol's value as variable is void: argv。我不是一个 emacs 用户,也不确定如何调试它。我看到很多建议,比如使用 emacs,这是唯一的方法吗?难道没有外部工具吗?(有时候我觉得我应该成为一个 emacs 用户!)谢谢。 - Ani
@vyom 这个错误很奇怪,因为 argv 应该是一个内置变量... 也许你可以尝试用 command-line-args-left 替换 argv。另外,你是否使用正确的参数 --load script-file--batch 调用了 emacs? 对了,你绝对应该成为一个 Emacs 用户,但现在还不晚 ;) - François Févotte
是的,我使用了给定的选项。将 argv 更改为 command-line-args-left 后,我遇到了其他错误,但缩进没有发生变化。这与 emacs 版本有关吗?我在 Redhat 上使用的是 21.3.1 版本。 - Ani
@vyom 是的,这可能与您的emacs版本有关。请查看我的编辑,其中包含一个一行命令,它不使用argv变量,但仅适用于一个文件。 - François Févotte
不行,这也不行!:( 我得到了 End of file during parsing。我也可以只用一个文件。 - Ani
@vyom 抱歉:我的错!我多打了一个左括号。在我的编辑中应该已经修复了。对不起。 - François Févotte

2
这是我创建的批处理模式缩进器yasi(另一个s表达式缩进器)的雄心壮志之作,您可以通过这里进行查看。如果由于某种原因它没有打动您(它大约有800行),您可以退而求其次使用lispindent2.lisp,它基本上是Dorai的原始缩进器lispindent.lisp在此基础上进行了一些调整。 lispindent2.lisp是一个批处理模式缩进器,与原始缩进器一样精简(增加了约65行代码),但仍然能够美观地进行缩进。

谢谢,现在我已经完全远离像lisp这样的东西了!但是在那个时候,当我在研究它时,我最终自己用C写了一个!:-/ 如果yasi当时可用,我肯定会使用它!现在我知道了,我会收藏它 :) - Ani
我有一种感觉,你不再使用Lispy了。你并不孤单。我想看看你的C版本(任何能够在C中制作出可行的文本处理程序的人都是我的偶像)。 - Plakhoy
我已经将相关部分剪切并粘贴到了这个Gist中 - https://gist.github.com/aniruddha-a/7983060;不确定是否足够通用,但当时这就是我所需要的,希望有所帮助。 - Ani

2
如果你使用vim,这篇文章应该会为你提供一种在所有文件上运行vim自动缩进命令的方法。如果你想要在vim中对lisp文件进行非常好的缩进(我个人认为),建议在运行该命令之前加载slimv和swank服务器。

我在vim/emacs中找到了许多例子,但我特别想要一个外部实用程序 - 可以批量运行。我知道vimemacs有批处理模式 - 但单独的实用程序会更好。 - Ani

1
Dorai Sitaram在这个网站上有关于这个目的的scmindent.scmlispindent.lisp脚本。它们最初的目的是让你在vi中缩进Lisp代码。

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