厉害,又学习了一个新技能。
(现学现卖行为
Emacs 30 上没有 benchmark-elapse
(require 'benchmark)
(benchmark 100
(add-subdirs-to-load-path user-emacs-directory))
"Elapsed time: 0.000005s"
要用 one-key + lazy-load, 这样我基本上就是默认只加载20多个包。
剩下几百个插件是用的时候再加载,再大插件动态加载都不会超过0.5秒,大多数都是瞬间动态加载,用的时候才加载。
递归扫描用自己写的递归加载函数,上面链接有,上百个插件目录都是瞬间扫描完的,扫描加到load-path不耗时,不用的插件启动就要require的操作才耗时。
从你的配置里还学到了 run-with-idle-timer
,这个应该可以翻译为闲时加载吧
对,zsbd
得先(require 'benchmark) , 才有benchmark-elapse
查了下文档,benchmark命令是当命令使的,如果想在elisp里评估的话,应该用benchmark-run:
(benchmark 2 (add-subdirs-to-load-path user-emacs-directory))
==> (2.653589 0 0.0)
源↓, 看看 doc 部分就好:
;;;###autoload
(defun benchmark (repetitions form)
"Print the time taken for REPETITIONS executions of FORM.
Interactively, REPETITIONS is taken from the prefix arg, and
the command prompts for the form to benchmark.
For non-interactive use see also `benchmark-run' and
`benchmark-run-compiled'.
FORM can also be a function in which case we measure the time it takes
to call it without any argument."
(interactive "p\nxForm: ")
(let ((result (benchmark-call (eval (pcase form
((or `#',_ `(lambda . ,_)) form)
(_ `(lambda () ,form)))
t)
repetitions)))
(if (zerop (nth 1 result))
(message "Elapsed time: %fs" (car result))
(message "Elapsed time: %fs (%fs in %d GCs)" (car result)
(nth 2 result) (nth 1 result)))))```
看来是我用错了,我直接在 scratch 里 eval 的,没有先行 eval (require 'benchmark)
重新测试了一下循环一百次 0.464602
秒,哈哈哈。
目前在用borg管理,感觉逐渐 submodule 化,再也不焦虑包的升级了。 最近听说 compat 转手,有breaking changes, magit依赖compat也受到了影响。上游怎么变我开始不太关心了,能用就好。
测试了下,确实不慢。而且我还是在老机器上。
目前配置也是逐渐用绑定按键autoload按需唤起,还在继续加工。从你那儿学习了不少配置
对, submodule的好处是,有时间再折腾最新版,比如过年得时候。
平常用比较新的版本就好,够用了。
万一更新挂了,直接 git reset 马上就可以回滚到历史版本,这样emacs工作环境永远都是稳定的。
emacs默认的递归扫描函数是不认node和pycache这些目录,如果你装了类似EAF的插件,扫描node目录都会花费很多时间。
可以用我在lazycat-emacs写的递归加载函数,要快很多。
已经用上了,感谢猫大~~
可以看下 /Applications/Emacs.app/Contents/Resources/include
里是不是有 emacs-mudule.h. 如果有的话,需要设置 rime-emacs-module-header-root
还真的是,感谢大佬提醒。
rime 没有发现 emacs-module.h 的原因是代码里的 (getenv "emacs_dir")
只能在windows环境下使用,macos和linux只会得到nil, 于是探测不到emacs.app位置:
(defun rime--guess-emacs-module-header-root ()
"Guess `emacs-module-module-header-root' from some known places."
(or
(let ((module-header (expand-file-name "emacs-module.h" (concat source-directory "/src/"))))
(when (file-exists-p module-header)
(file-name-directory module-header)))
(let* ((emacs-dir (getenv "emacs_dir")) ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-Variables.html
(header-file (expand-file-name "emacs-module.h" (concat emacs-dir "/include/"))))
(when (and emacs-dir (file-exists-p header-file))
(file-name-directory header-file)))))