外部lisp代码压头

外部lisp代码压头,lisp,indentation,Lisp,Indentation,我有一些像一样的lisp/scheme代码要缩进。 我搜索了GNUindent等工具,但没有找到 命令行实用程序/脚本。有很多可供选择 C/C++/Java,但不知何故我找不到任何适用于lisp/scheme的, 任何人都可以让我知道任何这样的压痕工具,如果可用 谢谢。您可以在批处理模式下使用emacs。例如,您可以创建一个文件indent.el (defun my/indent-file (fPath) (let ((buffer (find-file fPath))) (mess

我有一些像一样的lisp/scheme代码要缩进。 我搜索了GNU
indent
等工具,但没有找到 命令行实用程序/脚本。有很多可供选择 C/C++/Java,但不知何故我找不到任何适用于lisp/scheme的, 任何人都可以让我知道任何这样的压痕工具,如果可用


谢谢。

您可以在批处理模式下使用
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_文件
请参阅,例如,获取有关使用
emacs
进行批处理的惯用方法的更多信息

编辑

下面是一个单行程序,它只在一个文件上工作,但不使用
argv
变量(注意:参数顺序很重要):


Dorai Sitaram的
scmindent.scm
lispindent.lisp
脚本可用于此目的。它们最初的目的是让您在vi中缩进Lisp代码。

如果您使用vim,post应该为您提供一种在所有文件上运行vim的自动缩进命令的方法。如果您希望(IMO)在vim中对lisp文件进行非常好的缩进,我建议在运行该命令之前加载slimv和swank服务器。

我雄心勃勃地尝试创建一个名为yasi的良好批处理模式压头(另一个s表达式压头)。如果出于某种原因,它无法赢得您的支持(大约是
800行
行),您可以退回到
lispindent2.lisp
,它基本上是Dorai的原始压头(
lispindent.lisp
),并在这里和那里进行一些调整<代码>lispindent2.lisp是一种批处理模式压头,与原始压头一样精巧(添加了大约65行),但仍然可以完美地缩进。

我尝试了这个,得到了错误
符号的值,因为变量为空:argv
。我不是
emacs
用户,也不知道如何调试它。我看到了许多类似的建议——即使用
emacs
——这是唯一的方法吗?。是否没有外部UTIL?(有时我觉得我应该是一个
emacs
用户!)谢谢。@vyom这个错误很奇怪,因为
argv
应该是一个内置变量。。。也许您可以尝试将
argv
替换为
命令行args left
。另外,您是否使用正确的参数调用了emacs
--load script file
--batch
?是的,您肯定应该是emacs用户,但现在还不晚;)是的,我使用了给定的选项。在将
argv
更改为
命令行args left
时,我收到了其他错误,但缩进没有发生。这与
emacs
版本有关吗?我在Redhat上有
21.3.1
。@vyom是的,这可能与您的emacs版本有关。请参阅我的编辑,了解不使用
argv
变量但仅对一个文件起作用的一行程序。不,这也不起作用!:(,我在解析过程中得到了
文件的结尾。我也可以使用1个文件。我在
vim/emacs
中找到了许多示例,但我特别想要一个外部实用程序-我可以在批处理模式下运行。我知道
vim
emacs
都有批处理模式-但是单独的实用程序会很好。谢谢,现在我有了我[完全]远离了任何类似于
lisp
!,但在我编写它的时候,我终于自己用C!:-/。如果yasi可用,我肯定会使用它!现在我知道了,我会把它添加到书签中:)我觉得你不再做任何Lispy了。你不是唯一一个这样的人。我想看看你的
C
版本(任何能在
C
中制作一个工作文本咀嚼程序的人在我的书中都是个坏蛋。)我已经将相关部分剪切粘贴到这个要点上了-;不确定这是否足够通用以满足所有需求,但当时我只需要这些,嗯。
emacs --batch MY_FILE --eval '(indent-region (point-min) (point-max))' -f 'save-buffer'