如何在命令行程序中使用emacs或vim的语法高亮功能?

7

我有一个命令行程序,会输出JSON和YAML格式的内容。默认情况下,它会检测是否安装了pygments (pygmentize),如果安装了,就通过它来获得漂亮的着色输出。然而,在大多数计算机上,默认情况下并没有安装pygments。但是,大多数计算机上都已经安装了emacs或vim。是否有一种方法可以让其中一个编辑器使用ANSI转义序列对某些文本进行语法高亮处理,然后再将其输出?


顺便说一下,我刚刚发现了coderay。它是基于Ruby的,其命令行程序比pygmentize快得多。 - Steven Haryanto
1
另一个选择是GNU Source-highlight。我使用它来在less中获得颜色。 - Randy Morris
@RandyMorris:是的,甚至有一个CPAN模块支持它(我的程序基于Perl)。唯一的问题是依赖项相当大(安装source-highlight及其dev库以构建CPAN模块需要拉取约100MB的Debian软件包)。 - Steven Haryanto
我通过创建JSON和YAML颜色转储器解决了我的问题。结果我并不真正需要语法高亮(脸红)。但是我感谢答案中的建议。 - Steven Haryanto
5个回答

5

由于编辑器已经可以处理ANSI编码,因此制作编辑器的屏幕截图相对容易,不是吗?

script -qc "stty rows 10000
emacs -nw -visit YOURFILE.YAML -eval '(redisplay t)' -f kill-emacs
resize"

(仅适用于GNU FSF Emacs的重新显示)

现在清理捕获内容

perl -p0E 's/\A(?s:.*)\e\[27m\r\n
\e\[A\n((?s).*?)
(?:\e\[K\n)+
\e.*\e\[27m\r$(?s:.*)\Z/$1/mx' < typescript

如果你不想在屏幕上可见录制过程,可以使用类似于 perl 的 IO::Pty 将其包装在隐藏的终端中。


不错的技巧!不过对于手头的问题有点过度了。谢谢。 - Steven Haryanto

4
Matthew Wozniski编写了一个名为vimcat.sh的脚本,使用Vim实现此功能。他的版本在https://github.com/godlygeek/vim-files/blob/master/macros/vimcat.sh上。我对其进行了一些修改(如果我没记错的话,这些修改使它可以在我的Mac OS X系统上运行;我知道将/proc/self/fd/9替换为/dev/fd/9是为了达到这个目的);请参见我的要点https://gist.github.com/4090959
我认为这两个版本的脚本都存在问题,如果Vim的高亮更改了背景,则难以返回默认背景颜色。

2
像Emacs一样(参见ataylor的答案),Vim可以将缓冲区以完整的语法高亮渲染为HTML;请参见:help 2html.vim。你可以重用大部分遍历缓冲区语法的插件代码,并将其更改为呈现ANSI转义序列,但你必须自己重新实现所有呈现逻辑。
虽然有一些插件将Vim用作分页器,但我认为不可能仅使用Vim输出带有ANSI转义序列的缓冲区。毕竟,Vim想要保留对终端的控制,并在退出时清除终端。
我建议寻找另一个专门的解决方案,而不是Vim,尽管这意味着你需要安装它。

1

Emacs 包含一个名为 htmlfontify 的函数,它可以将带有字体高亮的缓冲区转换为 HTML。您可以使用一个小的 elisp 脚本批处理模式来将文件渲染为 HTML。例如:

emacs -q --batch --file myfile.rb --eval '(progn (require (quote htmlfontify)) (htmlfontify-buffer) (set-buffer-modified-p t) (save-buffer))'

谢谢。抱歉没有说明清楚,我需要使用ANSI转义序列,因为我要输出到终端。我的EmacsLisp技能非常有限,但是你给了我一些指导,让我可以尝试着做。 - Steven Haryanto

1

如果您不想遵循@IngoKarkat的建议并重写标准插件以支持ANSI转义序列,则可以使用我的formatvim插件,它通过使用支持渲染到ANSI转义序列。

Format format csi to /path/to/file

最初我的插件是标准2html的重写,旨在支持不同的格式,并且可以轻松添加新的格式(我花了大约30分钟来添加ANSI转义序列的支持,主要是阅读这些序列的规范),但当前的代码已经发展到无法提及相似之处。它被认为在处理大文件或者使用一个vim实例渲染多个文件时工作更快(即当预热(“编译”和缓存填充)阶段被进一步运行的好处所掩盖)。


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