在Emacs中加载后,何时使用添加挂钩、评估

在Emacs中加载后,何时使用添加挂钩、评估,emacs,hook,major-mode,eval-after-load,Emacs,Hook,Major Mode,Eval After Load,我读过了。根据网页上的信息, 加载后评估中的代码执行一次。 另一方面,每次打开该模式的缓冲区时,addhook中的代码都会运行 嗯。但是,我如何确定加载后eval块或addhook块中应该包含哪些代码?比如说, (eval-after-load "js2-mode" '(progn (js2-basic-offset 2))) 或 我不是在问js2基本偏移量 有一般规则吗? 或每当我在加载后使用eval,我都会问?您是设置全局变量还是局部变量 如果要设置缓冲区局部变量(其值在不

我读过了。根据网页上的信息, 加载后评估中的代码执行一次。
另一方面,每次打开该模式的缓冲区时,
addhook
中的代码都会运行

嗯。但是,我如何确定加载后
eval
块或
addhook
块中应该包含哪些代码?比如说,

(eval-after-load "js2-mode"
  '(progn
      (js2-basic-offset 2)))

我不是在问
js2基本偏移量

有一般规则吗?
或每当我在加载后使用
eval
,我都会问?

您是设置全局变量还是局部变量

如果要设置缓冲区局部变量(其值在不同缓冲区中可能不同),则必须在加载文件后进行设置,因此在主模式钩子中。如果调用对当前缓冲区有影响的函数,也会发生同样的情况

如果您正在设置一个全局变量,那么在模式钩子中这样做是没有意义的:只要您碰巧以特定模式加载文件,您就会更改一个全局变量。如果调用影响全局设置的函数,也会发生同样的情况

许多全局变量可以直接在
.emacs
中设置,而无需等待将声明并使用它的库被加载。事实上,全局变量的情况通常是这样

js2基本偏移量
是一个变量,而不是一个函数。如果要在所有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具有内置功能,涵盖了在每个文件或每个项目的基础上设置变量的典型用例:和。

感谢您的回复。但是我想在加载后使用
eval
的主要原因是减少加载时间
setq js2基本偏移量
add hook
在加载后评估中是一个坏主意?@1ambda这对于一大块代码来说是有意义的,但是如果您只设置了几个变量,那么在加载后使用
eval
注册它们比直接设置它们花费的时间更长。
(defun custom:js2-config ()
  (when (…)
    (make-local-variable 'js2-basic-offset)
    (setq js2-basic-offset 2)))
(add-hook 'js2-mode-hook 'custom:js2-config)