我正试图编程GNU Emacs 23来按需发布require
命令,而不是在我的.emacs
文件的前面。如果我想延迟执行load
命令,我可以使用autoload
。但require
和load
采取不同的论点。什么Emacs Lisp函数'`需要``自动加载`是`加载`?
有没有为require
做一个预定义的功能,autoload
为load
做的是相同的作业?如果不是,人们会推荐我用什么工具来推出自己的产品?
我正试图编程GNU Emacs 23来按需发布require
命令,而不是在我的.emacs
文件的前面。如果我想延迟执行load
命令,我可以使用autoload
。但require
和load
采取不同的论点。什么Emacs Lisp函数'`需要``自动加载`是`加载`?
有没有为require
做一个预定义的功能,autoload
为load
做的是相同的作业?如果不是,人们会推荐我用什么工具来推出自己的产品?
关于autoload
,require
和load
之间没有区别。 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
的foo-function
,您可以使用(require 'foo)
加载。
对于“按需”,您有什么样的“需求”?
如果给定的命令或其他功能的需求(或软需要)一个给定的库,然后发挥功能本身可以使用(require 'foo)
或(require 'foo nil t)
。该库将从该功能按需加载。
还要考虑是否需要多次加载文件,即在某些情况下重新加载文件,而不管是否已加载文件。
#2,例如,我的代码,使用Lisp的宏库,icicles-mac.el
不只是使用require
,因为我要确保,如果用户获取库的新版本 (例如,下载一个新的源代码版本并进行字节编译),那么只要字节编译需要它的另一个库,就会使用这个新版本。 (这一点很重要 - 当宏改变,使用这些宏通常需要加载新的宏文件后重新编译其他库库)。对于这一点,而不是只(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'.
还有一个答案,以帮助澄清(这是对评论有点冗长):
autoload
说:“如果这功能尚未定义,那么这load
文件(如果当函数被调用)。“require
说“如果这个库尚未加载,那么load
这个文件(立即)。“特别是请注意,你不需要使用require
加载库;这只是你保证你不会加载它再次(假设你不想要的方式。这样做)库中的(provide 'FEATURE)
表达会无论库的加载方式进行评估,它可以让任何未来require
知道,它不需要做任何事情
这对autoload
类似的情况 - 如果该文件已被加载(因此正确定义的功能),然后是自动加载更长的时间有任何影响。
你能举一个你如何使用这个你不能用'autoload'做的例子吗? – Barmar
(可能有帮助)http://ergoemacs.org/emacs/elisp_library_system.html – AAAfarmclub