何时使用加载,Emacs加载后评估

问题描述:

我已阅读eval-after-load vs add-hook。根据页面,代码eval-after-load被执行一次。
另一方面,add-hook内的代码每次打开时都会运行该模式的缓冲区。何时使用加载,Emacs加载后评估

好的。但是我怎样才能找出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中设置,而无需等待将声明并使用它加载的库。事实上,全局变量通常是这种情况。

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

+0

感谢您的回复。但是我希望使用'eval-after-load'的主要原因是减少了加载时间。加载后eval中的'setq js2-basic-offset'或'add-hook'是个坏主意? – 1ambda 2014-10-12 14:38:57

+1

@ 1ambda这对于一大段代码来说是有意义的,但是如果你只设置了一些变量,那么用'eval-after-load'注册它们会比直接设置它们花费更长的时间。 – Gilles 2014-10-12 14:44:40