【向大家求助】讨论一种 Package 的懒加载方案,实现需要帮助

with-eval-after-load, autoload, run-with-idle-timer几个API,一点Lisp基本语法, major-mode-hook的用法。这些知识点也许够用来优化你的工作流了。

我用 emacs -q 或者 -Q 启动后马上执行 M-X,以 python 做前缀的函数确实只有 python-mode, 说明是 autoload的。

但如果启动后执行 describe-function ,输入 “python-” 后按 tab, 就会显示大量 python前缀的函数,之后 M-x 里各类 python-xxx 命令也出现了,似乎是这个前缀加 tab 触发了 python-mode 的加载。

describe-function 输入其他前缀(比如 py,python)再按 tab 则只会补全出 python-mode 这一个 autoload 函数

在查找文档的时候也会触发 autoload,详见

1 个赞

用快捷键 C-h f 不会出现。用M-x describe-function 确实会多加载很多东西,但是这有什么关系呢?这正好证明了确实是懒加载。不明白你的纠结点是什么。

按照 @VagrantJoker 提供的文档,设置为(setq autoload-compute-prefixes nil)就啥都没有了。

1 个赞

python-mode 确实是懒加载的,纠结是有些细节比较迷惑,对使用没什么影响,纯粹是好奇。

因为验证是否懒加载的时候,我正好是 C-h f 后输入 ‘python-‘ ,再按 tab 来检查当前有哪些 python- 前缀开头的函数。 没想到对这个前缀的补全又恰好会引发加载,导致我还以为它不是 autoload 的。 (我这用 c-h f 或 describe-function 都会触发)

主要这不是在搜索某个函数的文档时候触发的,而是在 describe-function 的 minibuffer 里输入目标函数的 prefix 进行补全时触发加载(而且只有 python- 这个前缀会触发,这定义在 definition-prefixes 里),可以感觉到写这些代码的人考虑了很多‘细枝末节’:joy:

@twiddling @alexluigit 目前我发现只使用 use-package 就可以达到我的要求了:需要在加载包的配置上添加 commands 指令,以及后续关联启动的包添加 after 指令。

感谢 @manateelazycat 提供的性能检测脚本,我优化过程中的调试都是基于这个脚本展开的。

现在还有点儿小问题,我还在修改配置。目前我的 Emacs 在 14 款的 MBP 上启动速度已经到了 1.7 秒左右,距离 -Q 参数的 0.5 秒启动时间,已经在可以忍受的范围了。后面应该还可以提高一部分时间。等我抽出时间了,写一个 Python 的 Demo 吧,这样再有人有类似的问题,就可以参考我这部分代码了。

这里放出来自己的配置地址,有需要的可以取用。不过我时刻都在更新,可能不稳定,仅供参考。

2 个赞

@manateelazycat 大佬,我最近在配置 Vue 的 tree-sitter,按照你提供的配置,gcc 编译的过程中异常,能告知解决办法吗?

新的工作可能需要写 Vue 3,目前还有两个问题没解决:

  • 第一个就是 Vue 的 tree-sitter,因为没有自带,所以需要找到第三方后自行编译,就遇到了上面提到的问题;
  • 第二个就是在 minibuffer 里面没有类型提示,但我在开发 react 的时候,jsx/tsx 文件都正常;

如果大佬有时间,烦请在百忙之中瞄一眼,万分感激 :pray: