用 Pygmentize 高亮代码块

org-mode 导出 HTML 代码高亮难看 继续讨论:

Org 默认的导出 HTML 方案采用 htmlize 提供代码高亮,优缺点都有。好在有别的办法获得代码高亮,即使不打算自己实现代码高亮的话,可以用现成的,比如 Pygmentize,Highlight.js 等等。

下面介绍一个刚想到的办法,采用的是 Org 自带的 HTML 导出 (C-c C-e h) 结合上 Pygmentiz:

  1. 禁用 htmlize

    (setq org-html-htmlize-output-type nil)
    
  2. 修改 org-html-src-block

    (define-advice org-html-src-block (:override (src-block _contents info) pygmentize)
      "Highlight src-block via Pygmentize."
      (let ((lang (org-element-property :language src-block))
            (code (org-html-format-code src-block info)))
        (with-temp-buffer
          (call-process-region code nil "pygmentize" nil t nil "-l" lang "-f" "html")
          (buffer-string))))
    
  3. 在 Org 中加入 Pygmentize 的 CSS

    #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://rawgit.com/richleland/pygments-css/master/default.css" />
    

Pygmentize 也支持 LaTeX,估计用类似的方法在 PDF 中得到高亮。

这种方法如果代码块比较多的话也会造成拖慢,因为对每个代码块高亮的时候都会调用外部进程 pygmentize,如果比较在意性能的话,我觉得还是导出之后,使用 python 将原始代码替换比较好,那样只调用一次 python。

1 个赞

哪有这个资料?

http://pygments.org/docs/formatters/#LatexFormatter

~ $ echo '(+ 1 2)' | pygmentize -l elisp -f latex
\begin{Verbatim}[commandchars=\\\{\}]
\PY{p}{(}\PY{n+nf}{+} \PY{l+m+mi}{1} \PY{l+m+mi}{2}\PY{p}{)}
\end{Verbatim}
1 个赞

假如 pygmentize 支持 REPL / Daemon / Server 的话:

$ pygmentize --daemon -f html
> (c . "printf ("hello");\n")
...
> (emacs-lisp . "(emacs-version)")
...

Emacs 就可以 Subprocess 的形式调用它,只需要启动一次 Python。