在批处理模式下使用 emacs 转储带有语法突出显示的文件?

Posted

技术标签:

【中文标题】在批处理模式下使用 emacs 转储带有语法突出显示的文件?【英文标题】:Using emacs in batch mode to dump a file with syntax highlighting? 【发布时间】:2014-06-20 14:39:54 【问题描述】:

我想在某种批处理模式下使用 emacs 来渲染带有语法突出显示的文件并退出。具体来说,我想用 ANSI 转义码转储字体化缓冲区,以便它在我的终端上以合理的语法高亮显示。有没有办法做到这一点?

ansi-lpr.el 库似乎有点符合我的要求,但输出没有着色。我不知道如何克服最后的障碍——有很多模块可以将 ANSI 转义码消化成 Emacs 文本属性(例如ansi-color.el),但我还没有找到任何相反的东西。如果有人能指出我做的事情,我想我可以把剩下的拼凑起来。

另外,我看到了一些 hacky 方法,例如 this answer(使用 script 并捕获输出),但在我的实验中,这种方法似乎不太可能取得成果——你会得到大量不受欢迎的控制序列与突出显示的文本。

这里的首要动机是在我分页文件时在 $LESSOPEN 管道中使用 emacs 来获得语法高亮。如果您要说的话,我已经尝试过,“仅 Emacs 中的页面文件”对我来说是不可接受的。

【问题讨论】:

你想要什么格式的颜色? ANSI 颜色转义似乎是您想要的,但我不确定这是否可行。 Emacs 缓冲区 ==> html ==> 文本可以吗? @PythonNut:是的,我想要 ANSI 颜色代码。我没有尝试过 Emacs => HTML => text;我怀疑这是否能很好地工作,但根据 HTML 输出,我想它实际上可能不会太糟糕。 【参考方案1】:

我很高兴宣布一个新软件包 e2ansi,它(希望)能满足您的要求。

该软件包提供了一个命令行工具e2ansi-cat,它以批处理模式启动 Emacs、打开文件、语法高亮它们(使用字体锁定),并创建语法高亮文件的 ANSI 色版本。

您可以将其集成到less,方法是将以下变量设置为,例如:

export "LESSOPEN=|emacs --batch -Q -l ~/.emacs -l bin/e2ansi-cat %s"
export "LESS=-R"
export MORE=$LESS

最终结果如下所示:

您可以改变颜色和属性,例如粗体、下划线和 斜体,使用合适的 Emacs 主题。

e2ansi 包位于https://github.com/Lindydancer/e2ansi

个人笔记

感谢您发布这个问题,它直接启发了我写 e2ansi。

【讨论】:

太棒了!谢谢!我使用custom-set-faces 调用在我的.emacs 中设置了自定义颜色。 e2ansi 似乎没有使用这些。这是预期的吗?有没有办法让它们被应用? --theme 选项听起来最相关,但我对 Emacs 主题一无所知。 是的,您的个人颜色设置应该可以使用。但是,当使用 --batch 选项时,Emacs 不会读取您的个人 init 文件。因此,您必须使用 -l 选项显式加载它。在答案中less 的示例中,我假设它被命名为~/.emacs 啊,太好了!我已经开始尝试了。 First issue filed,我们看看有没有更多的弹出... 非常好。您能否添加一些处理批处理模式所必须做的事情,例如,特别是 wrt 字体锁定?将此答案连接到例如***.com/questions/3591337/emacs-htmlize-in-batch-mode 也很好。 @Clément,在批处理模式下,字体锁定通常不会自行启用。我想如果您只将 font-lock 视为在 Emacs 框架中获得语法突出显示的一种方式,那么这是有道理的,而在批处理模式下您不需要这种方式。因此,对于这种应用程序,您将不得不欺骗 font-lock 使其相信它不是批处理模式。我通过将noninteractive 设置为零来做到这一点:(let ((noninteractive nil)) (font-lock-mode 1))。其次,字体锁定模式不会突出显示整个缓冲区,只突出可见部分,因此您必须执行(font-lock-fontify-region (point-min) (point-max)) 之类的操作。

以上是关于在批处理模式下使用 emacs 转储带有语法突出显示的文件?的主要内容,如果未能解决你的问题,请参考以下文章

Emacs支架和支架突出显示?

如何在 Emacs 中选择或突出显示一个块?

knitr Markdown 在 Emacs 中突出显示?

Emacs:在评论中突出显示 TODO *only*

在文字处理器中突出显示语法的代码[关闭]

组织模式捕获模板中的转义字符