Emacs Lisp函数是`require`,因为`autoload`是`load`?

Nor*_*sey 7 emacs elisp

我正在尝试编写GNU Emacs 23来require按需延迟发出命令,而不是在我的.emacs文件中预先发出.如果我想延迟执行load命令,我可以使用autoload.但是requireload采取不同的论点.

是否有确实为一个预定义的功能require,同样的工作autoload做的load?如果没有,人们会建议我使用哪些工具来推销自己的工具?

lun*_*orn 7

关于require和之间没有区别. 只是一个前端,或多或少归结为:loadautoloadrequireload

(defun require (feature &optional filename noerror)
  (unless (featurep feature)
    (let ((filename (or filename (symbol-name feature))))
      (load filename noerror))))
Run Code Online (Sandbox Code Playgroud)

如您所见,给定的符号名称require等于给定的文件名load.事实上,(require 'foo)在Emacs会话中评估的第一个等同于(load "foo").

因此,你可以只使用(auto-load 'foo-function "foo")foo-function从图书馆foo,你可以加载(require 'foo).


phi*_*ils 5

还有一个答案可以帮助澄清(这个评论有点冗长):

  • autoload说"如果这个函数还没有定义,那么load这个文件(如果和函数被调用的话)."
  • require说"如果这个尚未加载,那么load这个文件(立即)."

请特别注意,你没有需要使用require加载库; 这只是你保证你不会加载的方式再次(假设你不希望这样做).(provide 'FEATURE)无论库如何加载,都将评估库中的表达式,这使得任何未来都require知道它不需要做任何事情.

这是一种类似的情况autoload- 如果文件已经被加载(因此正确定义的函数),那么自动加载不再有任何影响.