Emacs 25 compiled file conflicts with Emacs 24

Issue

上周日,我看到评论说 Emacs 25 调用了 Mac 原生的图形接口,性能得到了大幅提高,便也在自己的 Mac 上装了最新的 Emacs 25 。性能的确有很大提高。但是,因为还不是稳定版本,总还是有点问题,比如颜色不准确之类的。在这里讲一下折腾了我好久的一个问题。

我遇到的第一个问题是 gh.el (一个提供 Github API 的库, Magit, helm, gist.el 都信赖于它)调用了一个在 Emacs 25 中失效的 API ,因此导致 Magit 无法呼出。这个问题非常严重,于是我打算换回 Emacs 24 。

此时,我发现 Emacs 24 也无法打开了,遇到了以下报错:

Symbol's function definition is void: eieio-make-class-predicate

我以为是 Emacs 25 安装时把 Emacs 24 的包搞乱了。于是尝试重装 24 ,多次尝试后无果。让我陷入了一个没有 Emacs 可用的境地。

折腾几个小时后,发现将 Emacs 25 编译产生的 .elc 文件都删除用 Emacs 24 重新编译一遍就能正常打开 Emacs 24 了。

估计问题原因是 Emacs 25 对 eieio 库做了某些改动,编译出了 Emacs 24 不兼容的版本。

Solution

eieio

  1. Remove all .elc files

    find . -name '*elc' -delete
    
  2. Reopen Emacs to recompile these files
  3. Don't use multiple versions of Emacs on the same machine again

gh.el

移除和 Github 相关的库就能正常使用 Emacs 25 了。虽然还有一些小问题,比如更容易崩溃,不会传 ESC 键给系统(迷之 bug ,没有这个都无法让 Rime 在退出 evil-insert-mode 时切换成 Normal mode 了),但是性能的提升摆在那里,我还是选择了继续使用 Emacs 25

附寻找 bug 源的方法

使用 ag 在第三方库代码文件夹中找出错的函数

ag --nocolor --literal --line-number --smart-case --nogroup --column -u -- fringe-bitmap-p .