16.10 加载相关钩子

你可以通过变量 after-load-functions,让 Emacs 在每次加载库时执行指定代码:

Variable: after-load-functions

这个非常规钩子会在加载文件之后运行。钩子中的每个函数都会被传入一个参数,即刚刚加载的文件的绝对文件名。

如果你希望在加载 某个特定 库时执行代码,请使用宏 with-eval-after-load

Macro: with-eval-after-load library body…

该宏会安排在每次加载 library 文件的末尾执行 body。如果 library 已经加载,则立即执行 body

你不需要在文件名 library 中指定目录或扩展名。通常只需给出裸文件名,例如:

(with-eval-after-load "js" (keymap-set js-mode-map "C-c C-c" 'js-eval))

若要限制哪些文件能触发执行,可以在 library 中加入目录、扩展名或两者都加。只有其绝对真实名称(已展开所有符号链接的名称)完全匹配给定名称各部分的文件才会触发。 在下例中,位于 ..../foo/bar 目录下的 my_inst.elcmy_inst.elc.gz 会触发执行,但 my_inst.el 不会:

(with-eval-after-load "foo/bar/my_inst.elc" ...)

library 也可以是一个功能(即符号),此时 body 会在任何调用了 (provide library) 的文件末尾执行。

body 中出现的错误不会撤销加载操作,但会阻止 body 中后续代码的执行。

通常,设计良好的 Lisp 程序不应使用 with-eval-after-load。 如果你需要读取或设置其他库中定义的变量(那些供外部使用的变量),可以直接操作,无需等到库加载完成。 如果你需要调用该库定义的函数,你应该先加载该库,推荐使用 require(see 功能)。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike