在批处理模式下使用 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 转储带有语法突出显示的文件?的主要内容,如果未能解决你的问题,请参考以下文章