在不退出Emacs的情况下,如何重新加载配置文件?

我用的是Steve Purcell大神的配置,因此个人改动基本是在init-local.el中进行改动。

当我改动init-local.el后,在不退出Emacs情况下,想重新加载init-local.el时,会使用命令M-x load-file。但是我发现这个命令在重新加载配置文件后,它产生的效果是附加(Append),而不是刷新(Refresh)已有的配置。
比如,我在配置文件中,将代码从:

(global-set-key "\C-s" 'swiper)

改成

(global-set-key "\C-f" 'swiper)

重新用命令M-x load-file加载配置文件后,快捷键C-f会立即生效,但同时原有的C-s仍有效。而我的原意是想在重新加载配置文件后,只有快捷键C-f会生效,C-s不再有效,也就是配置被刷新了。但目前情况却是将新的配置载入到Emacs中,而原有的仍不变,也就是附加进去了。:joy:
所以,我想问下用什么办法或命令可以在不退出Emacs情况下,重新加载或刷新配置文件?

1 个赞

这个特性叫还原点 还没有加入mail list。

  • 你以为是「Refresh」,其实你做了两个操作:添加旧代码,添加新代码;而 Emacs 执行了两次「Append」:一次旧代码,一次新代码

    假如你向 A餐馆订了外卖,然后又向 B餐馆定了一份,最后到手肯定是两份。

    想要保留一份,有以下方法:

    1. 打电话给 A餐馆退订。
    2. 时光倒流,回到原点,只向 B餐馆预定。
  • “杀鸡焉用牛刀”,配置文件也是一样的

    小幅修改,只要让该部分代码生效就可以了,没必要 reload 整个配置文件。不仅没必要,而且要避免,因为这个操作副作用很大

  • 没事别重新 load 配置文件

    当你认为已经严重到了需要 reload 配置文件的时候,请重启 emacs。

1 个赞

哦,原来是这样啊

嗯,是的。做过了很多次以后才发现的。但是说的这个问题同样是只执行修改后的代码无法解决的。执行新代码后,原代码仍然有效,不会被新代码内容替换。

是的,我也是通过10多个小时的血的教训才意识到的。

测试小段代码,直接eval那几行。如果大面积修改后测试(可能假设有些包不该被加载),重启emacs比较稳妥。

定义 kbd 大概可以理解成往一个 K-V 数据库里写入了一对数据,K 是键,V 是绑定的函数,当你再次执行一段代码的时候,这个“K-V数据库”并不会再你再次执行代码之前重置,所以你其实是往这个“数据库”中添加了一对新的值。

尝试,原有代码: (global-set-key (kbd "C-s") 'hello) 改成: (global-set-key (kbd "C-s") 'world)

你就会发现先前 C-s'hello 的绑定已经失效了,因为“数据库”中 K 为 C-s 的那对值被覆盖了;这种情况下你可能又会得出结论: “它产生的效果是刷新(Refresh)已有的配置,而不是附加(Append)”

1 个赞