6

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

4

5 回答 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 之类的东西将其包装在隐藏的终端中

于 2012-11-16T16:03:52.820 回答
4

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

如果 Vim 的突出显示更改了背景,我相信这两个版本的脚本都无法返回默认背景颜色。

于 2012-11-16T21:17:19.337 回答
2

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

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

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

于 2012-11-16T07:53:16.193 回答
1

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

Format format csi to /path/to/file

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

于 2012-11-16T16:03:21.230 回答
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))'
于 2012-11-16T00:05:24.590 回答