何时使用加载,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 variables和directory-local variables。
感谢您的回复。但是我希望使用'eval-after-load'的主要原因是减少了加载时间。加载后eval中的'setq js2-basic-offset'或'add-hook'是个坏主意? – 1ambda 2014-10-12 14:38:57
@ 1ambda这对于一大段代码来说是有意义的,但是如果你只设置了一些变量,那么用'eval-after-load'注册它们会比直接设置它们花费更长的时间。 – Gilles 2014-10-12 14:44:40