使用Emacs批处理模式将文件转储并带有语法高亮?

6
我想使用emacs的批处理模式来渲染文件并退出,以带有ANSI转义代码的形式将已着色的缓冲区转储出来,从而在终端上显示适当的语法突出显示。是否有任何方法可以做到这一点?
看起来,ansi-lpr.el库似乎是我想要的,但输出没有颜色。我无法弄清楚如何克服最后的障碍 - 有许多模块可以将ANSI转义代码消化成Emacs文本属性(例如ansi-color.el),但我还没有找到做反向操作的东西。如果有人能指出一些这样的东西,我认为我可以拼凑出剩下的部分。
或者,我看到了一些hacky的方法,比如这个答案(使用script并捕获输出),但在我的实验中,这种方法似乎不太可能成功 - 你会得到大量不想要的控制序列混杂在突出显示的文本中。
这里的总体动机是在$LESSOPEN管道中使用emacs来进行语法突出显示,以便在分页文件时获得语法突出显示。如果你要说这个,我已经尝试过,“只需在Emacs中分页文件”对我来说是不可接受的。

你想要什么格式的颜色?ANSI颜色转义似乎是你想要的,但我甚至不确定那是否有效。Emacs缓冲区==>HTML==>文本可以吗? - PythonNut
@PythonNut:是的,我想要 ANSI 颜色代码。我还没有尝试过 Emacs => HTML => 文本的实验;我对它能否很好地工作持怀疑态度,但根据 HTML 输出的情况,我认为它可能实际上并不太糟糕。 - Peter
1个回答

6
我很高兴宣布一个新的包,e2ansi,它(希望)可以做您要求的事情。
该包提供了一个命令行工具e2ansi-cat,它以批处理模式启动Emacs,打开文件,进行语法高亮(使用字体锁定),并创建语法高亮文件的ANSI彩色版本。
您可以通过将以下变量设置为例如来将其集成到less中:
export "LESSOPEN=|emacs --batch -Q -l ~/.emacs -l bin/e2ansi-cat %s"
export "LESS=-R"
export MORE=$LESS

最终结果如下所示:

Example

您可以通过使用合适的Emacs主题来改变颜色和属性,如加粗、下划线和斜体。
e2ansi包位于https://github.com/Lindydancer/e2ansi
个人笔记:
感谢您发布这个问题,它直接激发了我写e2ansi。

太棒了!谢谢!我在我的.emacs中使用custom-set-faces调用设置了自定义颜色。这些似乎没有被e2ansi使用。这是预期的吗?有没有办法让它们被应用?--theme选项听起来最相关,但我对Emacs主题一无所知。 - Peter
是的,您的个人颜色设置应该可以正常工作。但是,在使用--batch选项时,Emacs不会读取您的个人init文件。因此,您必须使用“-l”选项显式加载它。在答案中的less示例中,我假设它被命名为~/.emacs - Lindydancer
啊,太好了!我已经开始尝试了。第一个问题已提交,我们将看到是否会出现更多... - Peter
非常好。你能否添加一些关于如何处理批处理模式的内容,特别是与字体锁定相关的内容,例如?将此答案与例如https://dev59.com/MFDTa4cB1Zd3GeqPGRpQ连接起来也会很好。 - Clément
@Clément,在批处理模式下,字体锁定通常不会自动启用。我猜这是有道理的,如果你只把字体锁定看作是在Emacs框架中获取语法高亮的方式,那么在批处理模式下你就不需要它了。因此,对于这种应用程序,您将不得不欺骗字体锁定,让它认为它不在批处理模式下。我通过将noninteractive设置为nil来实现这一点:(let ((noninteractive nil)) (font-lock-mode 1))。其次,字体锁定模式不会突出显示整个缓冲区,而只会突出显示可见部分,因此您需要执行类似以下代码的操作:(font-lock-fontify-region (point-min) (point-max)) - Lindydancer
谢谢!我在此期间已经弄清楚了其中的一些部分,尽管在我的应用程序中最终没有使用非交互式Emacs。我可能会在某个时候在emacs-dev上写一些关于它的东西 :) - Clément

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