【问题标题】:Utilizing emacs' or vim's syntax highlighter for command-line program?在命令行程序中使用 emacs 或 vim 的语法高亮?
【发布时间】:2012-11-04 16:18:11
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,我刚刚发现了 coderay。它是基于 ruby​​ 的,它的命令行程序比 pygmentize 快得多。
  • 另一个选项是GNU Source-highlight。我用它来获得less 的颜色。
  • @RandyMorris:是的,它甚至还有一个 CPAN 模块(我的程序是基于 Perl 的)。唯一的问题是依赖关系很大(安装 source-highlight 及其开发库来构建 CPAN 模块会拉取大约 100MB 的 Debian 包)。
  • 我通过创建 JSON 和 YAML 颜色转储器解决了我的问题。原来我真的不需要语法荧光笔(脸红)。但我感谢答案中的建议。

标签: vim emacs syntax-highlighting pygments


【解决方案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-fu 严重受限,但你给了我一些建议。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    Format format csi to /path/to/file
    

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

    【讨论】:

      【解决方案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 之类的东西将其包装在隐藏终端中

      【讨论】:

      • 好招!不过对于手头的问题有点矫枉过正。谢谢。
      【解决方案5】:

      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 的突出显示改变了背景,我相信这两个版本的脚本都无法返回默认背景颜色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 2010-10-26
        • 2014-11-14
        • 2011-02-11
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        相关资源
        最近更新 更多