使用emacs或vim的语法高亮显示器进行命令行程序?

时间:2012-11-15 23:37:18

标签: vim emacs syntax-highlighting pygments

我有一个喷出JSON和YAML的命令行程序。默认情况下,它会检测pygments(pygmentize)是否可用,如果可用,则将输出传递给它以获得漂亮的彩色输出。但是,默认情况下,在运行此程序的大多数计算机上不会安装pygments。但是,大多数计算机都有emacs或vim,但是。有没有办法让其中一个编辑器使用ANSI转义序列语法高亮显示一些文本然后再输出?

5 个答案:

答案 0 :(得分:4)

因为编辑器已经可以做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

答案 1 :(得分:4)

Matthew Wozniski编写了一个名为vimcat.sh的脚本,用Vim执行此操作。他的版本是https://github.com/godlygeek/vim-files/blob/master/macros/vimcat.sh。我对它进行了一些修改(如果内存服务,修改允许它在我的Mac OS X系统上运行;我知道/dev/fd/9替换/proc/self/fd/9有这个目的);在https://gist.github.com/4090959看到我的要点。

我相信如果Vim突出显示会改变背景,两个版本的脚本都会无法恢复默认背景颜色。

答案 2 :(得分:2)

与Emacs(cp.ataylor的回答)一样,Vim可以使用HTML的完整语法高亮显示缓冲区;见:help 2html.vim。您可能可以重复使用通过缓冲区语法的大部分插件代码,并将其更改为呈现为ANSI转义序列,但您必须自己重新实现所有渲染逻辑。

虽然有一些插件使用Vim作为寻呼机,但我认为不可能只使用Vim输出带有ANSI转义序列的缓冲区。毕竟,Vim希望保留对终端的控制权,并在退出时将其清除。

我建议在Vim之外寻找另一个专用解决方案,虽然这意味着你需要安装它。

答案 3 :(得分: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))'

答案 4 :(得分:1)

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

渲染到ANSI转义序列
Format format csi to /path/to/file

。最初我的插件是重写标准的2html目标,支持不同的格式支持,轻松添加新格式(我花了大约30分钟来添加ANSI转义序列支持,主要是读取这些序列的规范),但是当前的代码已经走得太远了提到相似之处。众所周知,对于大文件或者使用一个vim实例来渲染大量文件时(例如,当进行预热(“编译”和缓存填充)阶段被进一步运行的好处掩盖时),工作速度更快。