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
Remove all .elc files
find . -name '*elc' -delete
- Reopen Emacs to recompile these files
- 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 .