何时在Emacs中使用add-hook,eval-after-load

时间:2014-10-12 14:12:56

标签: emacs hook major-mode eval-after-load

我读了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时,我都要问?

1 个答案:

答案 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 variablesdirectory-local variables