我有一个命令行程序,会输出JSON和YAML格式的内容。默认情况下,它会检测是否安装了pygments (pygmentize),如果安装了,就通过它来获得漂亮的着色输出。然而,在大多数计算机上,默认情况下并没有安装pygments。但是,大多数计算机上都已经安装了emacs或vim。是否有一种方法可以让其中一个编辑器使用ANSI转义序列对某些文本进行语法高亮处理,然后再将其输出?
我有一个命令行程序,会输出JSON和YAML格式的内容。默认情况下,它会检测是否安装了pygments (pygmentize),如果安装了,就通过它来获得漂亮的着色输出。然而,在大多数计算机上,默认情况下并没有安装pygments。但是,大多数计算机上都已经安装了emacs或vim。是否有一种方法可以让其中一个编辑器使用ANSI转义序列对某些文本进行语法高亮处理,然后再将其输出?
由于编辑器已经可以处理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 将其包装在隐藏的终端中。
/proc/self/fd/9
替换为/dev/fd/9
是为了达到这个目的);请参见我的要点https://gist.github.com/4090959。:help 2html.vim
。你可以重用大部分遍历缓冲区语法的插件代码,并将其更改为呈现ANSI转义序列,但你必须自己重新实现所有呈现逻辑。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))'
如果您不想遵循@IngoKarkat的建议并重写标准插件以支持ANSI转义序列,则可以使用我的formatvim插件,它通过使用支持渲染到ANSI转义序列。
Format format csi to /path/to/file
最初我的插件是标准2html的重写,旨在支持不同的格式,并且可以轻松添加新的格式(我花了大约30分钟来添加ANSI转义序列的支持,主要是阅读这些序列的规范),但当前的代码已经发展到无法提及相似之处。它被认为在处理大文件或者使用一个vim实例渲染多个文件时工作更快(即当预热(“编译”和缓存填充)阶段被进一步运行的好处所掩盖)。