我正在尝试对GNU Emacs 23进行编程,以便根据需要懒惰地发出require
命令,而不是在我的.emacs
文件中预先发出。如果我想延迟执行load
命令,我可以使用autoload
。但require
和load
采用不同类型的论点。
是否有require
autoload
load
对{{1}}执行的预定义功能?如果没有,人们会建议我使用哪些工具来推销自己的工具?
答案 0 :(得分:7)
关于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
的文件名。事实上,在Emacs会话中评估的第一个(require 'foo)
相当于(load "foo")
。
因此,您可以使用(auto-load 'foo-function "foo")
foo-function
从foo
库中(require 'foo)
加载{{1}}。
答案 1 :(得分:5)
另外一个答案可以帮助澄清(这个评论有点冗长):
autoload
说“如果此函数尚未定义,则load
此文件(如果调用该函数时)。”require
说“如果此库尚未加载,则load
此文件(立即)。”请特别注意, 需要使用require
来加载库;这就是你确保不再加载的方式(假设你不想这样做)。无论库如何加载,都将评估库中的(provide 'FEATURE)
表达式,这使得任何未来的require
都知道它不需要做任何事情。
autoload
的情况类似 - 如果文件已被加载(因此正确定义了相关函数),则自动加载不再有任何效果。
答案 2 :(得分:2)
对于“按需”,您有什么样的“需求”?
如果给定的命令或其他功能需要(或软需要)给定的库,那么该功能本身可以使用(require 'foo)
或(require 'foo nil t)
。该库将按照该功能的要求加载。
还要考虑是否需要多次加载文件,即在某些情况下重新加载文件,无论是否已加载。
对于#2,例如,我使用Lisp宏库的代码icicles-mac.el
不只是使用require
,因为我想确保如果用户获得该库的新版本(例如,下载新的源版本并对其进行字节编译)然后每当s使用新版本时,它将对另一个需要它的库进行字节编译。 (这很重要 - 当宏库发生更改时,使用这些宏的其他库通常需要在加载新宏文件后重新编译。)为此,我使用此代码而不仅仅是(require 'icicles-mac)
:
(eval-when-compile
(or (condition-case nil
(load-library "icicles-mac") ; Use load-library to ensure latest .elc.
(error nil))
(require 'icicles-mac))) ; Require, so can load separately if not on `load-path'.