我有一个喷出JSON和YAML的命令行程序。默认情况下,它会检测pygments(pygmentize)是否可用,如果可用,则将输出传递给它以获得漂亮的彩色输出。但是,默认情况下,在运行此程序的大多数计算机上不会安装pygments。但是,大多数计算机都有emacs或vim,但是。有没有办法让其中一个编辑器使用ANSI转义序列语法高亮显示一些文本然后再输出?
答案 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实例来渲染大量文件时(例如,当进行预热(“编译”和缓存填充)阶段被进一步运行的好处掩盖时),工作速度更快。