2

我读过eval-after-load 与 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,我都必须问?

4

1 回答 1

6

你是设置全局变量还是局部变量?

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

如果您正在设置一个全局变量,那么在模式挂钩中这样做是没有意义的:每当您碰巧以某种模式加载文件时,您都会更改全局变量。如果您正在调用影响全局设置的函数,也会发生同样的事情。

许多全局变量可以直接在你的 中设置.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 具有内置工具,涵盖了基于每个文件或每个项目设置变量的典型用例:文件局部变量目录局部变量

于 2014-10-12T14:24:48.507 回答