【问题标题】:When to use add-hook, eval-after-load in Emacs何时在 Emacs 中使用 add-hook、eval-after-load
【发布时间】:2014-12-07 04:40:12
【问题描述】:

我读过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时,我都必须问?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    许多全局变量可以直接在您的.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

    【讨论】:

    • 感谢您的回复。但我想使用eval-after-load 的主要原因是减少加载时间。 eval-after-load 中的 setq js2-basic-offsetadd-hook 是个坏主意?
    • @1ambda 这对于一大段代码来说是有意义的,但如果你只设置几个变量,用eval-after-load注册它们会比直接设置它们花费更长的时间。
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2013-04-23
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多