我想更快地加载emacs init文件,所以我使用'eval-after-load。
例如,当我加载clojure文件时,我只是把
(eval-after-load 'clojure-mode
'do-something)
它有效。
但是当我尝试时
(eval-after-load 'emacs-lisp-mode
'do-something)
它不起作用。我想知道 emacs-lisp 的正确主要模式名称。
谢谢。
请阅读eval-after-load
的文档:
加载后评估库表单
此函数安排在每次加载 LIBRARY 时在加载文件库结束时评估表单。如果 LIBRARY 已加载,它会立即评估表单。不要忘记引用表格!
[...]LIBRARY也可以是一个特征(即符号(,在这种情况下,形式在调用
(provide LIBRARY)
的任何文件的末尾被计算。
您必须将定义主要模式的文件或库的名称作为参数传递。
虽然某些模式是在同名文件中定义的(例如 clojure-mode
在 clojure-mode.el
中(,许多文件的名称不同,特别是如果实际上定义了多个主要模式。
emacs-lisp-mode
在lisp-mode.el
中定义,以及其他一些用于Emacs Lisp编辑的模式(例如 lisp-mode
作为通用的 Lisp 语言模式,或lisp-interaction-mode
用于*scratch*
缓冲区(。
因此,请使用 (eval-after-load 'lisp-mode …
(
此外,您必须给出一个 sexp 作为第二个参数,因此您可能希望使用 (eval-after-load 'lisp-mode '(do-something))
来调用函数do-something
。
如果您使用的是 Emacs 的快照构建,请使用 with-eval-after-load
,即 (with-eval-after-load 'lisp-mode (do-something))
. 它允许使用多个表单,并且不需要引用。
只需使用变量major-mode
M-:
评估。它实际上是emacs-lisp-mode
.请注意,*scratch*
实际上是lisp-interaction-mode
。
至于您要做什么,请使用 (eval-after-load "lisp-mode")
.
正如@lunaryom所解释的,传递给eval-after-load
的arg不是函数名称,而是功能名称,它基本上是一个文件名。 因此,您需要找到从中加载函数的文件的名称。我们可以提供像 eval-after-defun
这样的功能,确实这样做可能是个好主意。 如果您想要这样的东西,请通过 M-x report-emacs-bug
索取。