我正在尝试编写GNU Emacs 23来require
按需延迟发出命令,而不是在我的.emacs
文件中预先发出.如果我想延迟执行load
命令,我可以使用autoload
.但是require
并load
采取不同的论点.
是否有确实为一个预定义的功能require
,同样的工作autoload
做的load
?如果没有,人们会建议我使用哪些工具来推销自己的工具?
关于require
和之间没有区别. 只是一个前端,或多或少归结为:load
autoload
require
load
(defun require (feature &optional filename noerror) (unless (featurep feature) (let ((filename (or filename (symbol-name feature)))) (load filename noerror))))
如您所见,给定的符号名称require
等于给定的文件名load
.事实上,(require 'foo)
在Emacs会话中评估的第一个等同于(load "foo")
.
因此,你可以只使用(auto-load 'foo-function "foo")
了foo-function
从图书馆foo
,你可以加载(require 'foo)
.
还有一个答案可以帮助澄清(这个评论有点冗长):
autoload
说"如果这个函数还没有定义,那么load
这个文件(如果和函数被调用的话)."
require
说"如果这个库尚未加载,那么load
这个文件(立即)."
请特别注意,你没有需要使用require
加载库; 这只是你保证你不会加载的方式再次(假设你不希望这样做).(provide 'FEATURE)
无论库如何加载,都将评估库中的表达式,这使得任何未来都require
知道它不需要做任何事情.
这是一种类似的情况autoload
- 如果文件已经被加载(因此正确定义的函数),那么自动加载不再有任何影响.