emacs26的一个Bug?或者是我使用方法不当?

最近更新了emacs26,发现之前一直用的 (setq default-tab-width 4) 失效了,默认的tab宽度被解释为8个空格,如果在buffer内再重新设一下tab-width,那么能正常解释为4个空格,可是这样好麻烦。 我换回了emacs25-3,但是emacs25-3的lua-mode似乎也有bug,总是提示 lua-get-token-match-re: Invalid byte opcode: op=183, ptr=2. 有没有知道怎么解决这两个问题当中的某一个?

  1. (setq-default default-tab-width 4)

  2. 换版本要把插件重新编译一遍。

我这就是一个.el文件在启动的时候用load命令加载了一遍。

其它插件都要重新编译

不是很懂你说的插件的概念。另外我修改了(setq-default default-tab-width 4),然而还是没生效啊?是需要你说的重新编译吗?我该怎么做?

我一般是这么搞的。删除 .emacs.d/elpa 下的所有文件然后重新安装一下

但我这个设置只是在.el文件里面的一行代码,也会受其他插件是否重新编译的影响吗?

不太清楚。
如果存在编译后的文件,就就会优先调用编译后的不会去调用 el 文件,所以你这个可能会失效。 而且可能是依赖的东西需要重新编译,所以可能受影响。

我把对所有插件的引用都去掉了,只在init.el里面加这一行命令,仍然没有用,我觉得应该不是编译与否的问题吧。

说的是你 Invalid byte opcode: 这个问题。。

哦,那个是在25下出现的,不过我之前好像是从26换到25的,我试试看吧。

@LdBeth 大佬的意思是:

  1. 对于一份emacs配置来说,一般分为两个部分,一部分配置是你自己写的,另一部分配置是通过emacs的包管理器安装的。前者是作为一份完整的emacs配置的顶层控制层,后者就是对于前者的类似于软件包依赖的概念的扩展,也就是通常所说的插件。

  2. 一般来说,如果你没有对EMACS中能够的 =package-user-dir= 做过任何自定义设定,插件通常是被安装在~/.emacs.d/elpa/ 中。其中的每一个插件虽然同样是el文件,但是在安装的时候是会被编译成byte-code的,这是为了加速启动过程,但是每一个版本的emacs所对应的编译机制是不一样的,因此,通常在更换emacs版本后需要重新编译一下你的插件源码。 当然最快的办法就像 @BlindingDark 所说的一样把所有插件删除然后重新安装。

1 个赞

阅读理解满分 :joy: 竟然能理解出这么多东西

明白了,谢谢。果然是这样,我把26降回25的时候没有重新编译lua-mode,所以它出了问题。

Emacs 的 ELC 向后兼容,意思是 Emacs 26.1 一定能使用 Emacs 25.3 的 ELC,而换个方向则不一定。比如

183 byte-switch 是 Emacs 26 新加入的,所以 Emacs 25.3 一定用不了包含它的 ELC。

2 个赞

的确 从官方介绍上的确如此 但是也有例外, 比如我使用的js补全插件tern-mode 就是26版本无法使用25版本的byte-code 文件。

我没法确认。如果你要证明例外存在,最好用直接证据,比如:下面一个表达式,Emacs 25 byte-compile 的结果 Emacs 26 无法执行。

比如用25安装了tern-mode和company-tern,那么如果配置没有做不同版本不通site-lisp文件夹分配的话,此时如果用26启动使用company-tern会报错,具体error info我不记得了,是几个月前的事,然后我在tern-mode的issue list中发现了这个问题是由于26使用了25的elc导致的,需要重新编译tern-mode。