我读了eval-after-load vs add-hook。根据页面,
eval-after-load
中的代码执行一次
另一方面,每次打开该模式的缓冲区时,add-hook
内的代码都会运行。
确定。但是,如何确定哪些代码应该在eval-after-load
块或add-hook
块内?例如,
(eval-after-load "js2-mode"
'(progn
(js2-basic-offset 2)))
或
(eval-after-load "js2-mode"
'(progn
(defun custom:js2-config ()
(js2-basic-offset 2))
(add-hook 'js2-mode-hook 'custom:js2-config)))
我不是在询问js2-basic-offset
有一般规则吗?
或者..每当我使用eval-after-load
时,我都要问?
答案 0 :(得分:5)
您是在设置全局变量还是局部变量?
如果您正在设置缓冲区局部变量(在不同缓冲区中其值可能不同),则必须在加载文件后完成,因此在主模式挂钩中。如果您正在调用对当前缓冲区有影响的函数,则会发生同样的情况。
如果你正在设置一个全局变量,那么在模式钩子中这样做是没有意义的:当你碰巧在特定模式下加载文件时,你将改变一个全局变量。如果您正在调用影响全局设置的函数,则会发生同样的情况。
可以在.emacs
中直接设置许多全局变量,而无需等待将声明并使用它加载的库。事实上,全局变量通常就是这种情况。
js2-basic-offset
是一个变量,而不是一个函数。如果要在所有JS缓冲区中配置缩进,请直接在.emacs
中设置缩进,使用
(setq js2-basic-offset 2)
或通过自定义界面。
如果你想在不同的文件中设置不同的值,那么你可以在主模式钩子中设置它 - 比如
(defun custom:js2-config ()
(when (…)
(make-local-variable 'js2-basic-offset)
(setq js2-basic-offset 2)))
(add-hook 'js2-mode-hook 'custom:js2-config)
您无需等待加载库以添加挂钩。
请注意,Emacs具有内置工具,涵盖了基于每个文件或每个项目设置变量的典型用例:file-local variables和directory-local variables。