推荐 minimal-emacs.d 给 emacs 配置减负加速

只有两个文件 early-init.el 和 init.el,一套非常合理的现代化编辑器默认配置。

很多选项跟我自己配的一样,换上直接清空一半配置,清爽多了,减轻自己维护配置的负担。

early-init 优化基本都是最佳实践,启动时间比我以前瞎抄的快 0.4s 左右。

目录也整齐了,而且全都不用自己写,路径都定义好了。

2 个赞

它这个启动速度(README 里的那个 0.22s)有作弊的嫌疑。它是用 emacs-init-time 来衡量启动速度的,但是实际上它的配置里大量使用了 after-init-hook 来加载包。after-init-hook 加载包根本就不是懒加载,它是无论如何在启动的时候一定会被加载的,只不过不会被 emacs-init-time 所测量而已。而且个人配置里也不应该用 after-init-hook 来加载配置。after-init-hook 应该是给包的开发者想设置一些启动时自动开启的 minor-mode,但是又要留给用户禁止它们在启动时自动开启的权利采用的。

实际测量标准应该用 emacs-startup-hook 来测量,它在 README 里也给了一个 example 的代码片段

您说的很有道理,我之前也想过after-init是不是在很多场合被图省事滥用了。往往大多数mode最后都是hook到after-init里面的,可能好一些的会有global-xxx-mode而已。

我一直也犹豫是否应该引入一套类似doom的精细化的hook:GitHub - axgfn/on.el: Hooks for faster Emacs startup – GitHub mirror

这样除了evil这类的,大部分编辑时使用的包可以精细到打开buffer的时候再加载。不知道您实际使用的时候有没有什么关于这方面的心得/标准?

有的。我实际上借鉴了大量 doomemacs 的 lazyloading 的代码片段。比较常用的有

  1. 在 pre-command-hook (doom 里叫 first-input)里加载一些包。这个其实也不建议滥用,这个仅仅只是比 emacs-init-hook 好一些,好在它至少是在 UI 已经加载完毕后才显示的。但是实际上它还是不算是真正意义上的懒加载,毕竟也算是接近立即加载的包。我会用它来加载 vertico 全家桶。
  2. 在某一个 hook 里面加载一个包,然后这个包加载完以后自己把这个加载包的函数从这个 hook 里面删除。这个我用的比较多的是在 evil-insert-state hook 里面用,也就是在进入 evil 的 insert 模式里面后才加载这个包,这个我用来懒加载和自动补全有关的包。推荐多利用这个。
  3. advice 某一个函数,在 这个函数第一次被调用的时候加载某一个包,然后在加载完后自己把自己这个 advice 移除掉。如果你不用 evil 而是使用 vanilla 可以考虑 advice self-inset-command 来加载自动补全插件。还比较常用的是给 find-file 加一个 :before 的 advice 。注意这个和在 find-file-hook 里加载某一个包的区别。有的包是需要在 find-file 之前就应该被加载的。
  4. incremental load。这个主要是加载 orgmode 这种非常巨大的包。简单来说就是,把 org 的子 dependency 按照依赖的顺序在 idle timer 里逐个加载,这样在加载 org 的时候由于很多子 dependency 已经加载了,就会快一些。

我一直也犹豫是否应该引入一套类似doom的精细化的hook

不建议引用别人的包搞这个。以上的例子都是一些非常简单的 elisp 包装就能搞定了,你让 AI 给你写一个 library 都很容易。自己用就好了,更灵活,还避免了别的包可能会搞的过度包装。

2 个赞

其实感觉这些延迟加载都是治标不治本, 最终方案还是全都加载进去再pdump, 下次启动emacs直接进入加载好的状态

最终方案是不关就好了。。。。之前linux是远程用,server端启动,不用了挂后台,用的时候ssh上以后切过去,然后换到mac,一个月重启不了一次,启动时间基本无视

谢谢分享,太详细了!

除了 minimal-emacs.el 之外,还有啥类似的初始配置?

prelude?

bedrock,nano

看了半天也没整明白 啥意思 就俩文件 其他文件自己配置在前后生命周期里?这架构也不行啊