Emacs: org-html-export 时出现 org-html-fontify-code: Wrong number of arguments…

前几天心血来潮,克隆了 Emacs 的 Github 镜像,自己编译了一个最新的 Emacs。而且非常无脑地把原来的 Emacs 删掉了。自此,各种小问题层出不穷,比如 org-html-export-as-html 时,经常会出现:

org-html-fontify-code: Wrong number of arguments: #[(_beg _end) "À ‡" [font-lock-fontify-buffer] 1], 0

1 解决方法

重新定义 org-font-lock-ensure 这个函数,在 init.el 里面加入以下代码并执行( C-x C-e ),即可解决问题:

(defun org-font-lock-ensure ()
  (font-lock-fontify-buffer))

2 HACK 记录

我发现,如果内容里没有代码块, org-html-export-as-html 就可以正常执行,所以很可能是代码块转化成 HTML 时出了问题。

M-x toggle-debug-on-error (在 Emacs 出现问题时打印 backtrace)

然后创建一个简单的 org-mode 文件,里面只包含一个 python 代码块:

def hello():
   print "hello world"

然后 M-x org-html-export-as-htmlBacktrace 如下(只显示了关键的部分):

Debugger entered--Lisp error: (wrong-number-of-arguments #[(_beg _end) "\300 \207" [font-lock-fontify-buffer] 1] 0)
  org-font-lock-ensure()
  org-html-fontify-code("def hello():\n   print \"hello world\"\n" "python")
  org-html-do-format-code("def hello():\n   print \"hello world\"\n" "python" nil t nil)
.
.
.

很明显,在运行 org-font-lock-ensure 时出了问题。

点进去看看其定义:

(defalias 'org-font-lock-ensure
  (if (fboundp 'org-font-lock-ensure)
      #'font-lock-ensure
    (lambda (_beg _end) (font-lock-fontify-buffer))))

意思是:如果 org-font-lock-ensure 没有定义的话,则将其定义为: (lambda (_beg _end) (font-lock-fontify-buffer))

这我就看不懂了,明明 font-lock-fontify-buffer 没有用到 _beg_end 两个参数,传进去干嘛呢?

不求深究(有可能是 org-mode 本身的漏洞),重新定义 org-font-lock-ensure 来避开这个问题:

(defun org-font-lock-ensure ()
  (font-lock-fontify-buffer))

再按 M-x org-html-export-as-html ,可以了,问题(暂时)解决!

3 经验教训

  • 没事儿不要随便升级软件
  • 要升级也尽量保留原先的版本

Leave a Reply