2014-01-06 110 views
6

我正试图编程GNU Emacs 23来按需发布require命令,而不是在我的.emacs文件的前面。如果我想延迟执行load命令,我可以使用autoload。但requireload采取不同的论点。什么Emacs Lisp函数'`需要``自动加载`是`加载`?

有没有为require做一个预定义的功能,autoloadload做的是相同的作业?如果不是,人们会推荐我用什么工具来推出自己的产品?

+5

你能举一个你如何使用这个你不能用'autoload'做的例子吗? – Barmar

+0

(可能有帮助)http://ergoemacs.org/emacs/elisp_library_system.html – AAAfarmclub

回答

6

关于autoloadrequireload之间没有区别。 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")来自库foofoo-function,您可以使用(require 'foo)加载。

2

对于“按需”,您有什么样的“需求”?

  1. 如果给定的命令或其他功能的需求(或软需要)一个给定的库,然后发挥功能本身可以使用(require 'foo)(require 'foo nil t)。该库将从该功能按需加载。

  2. 还要考虑是否需要多次加载文件,即在某些情况下重新加载文件,而不管是否已加载文件。

#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'. 
4

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

  • autoload说:“如果这功能尚未定义,那么这load文件(如果当函数被调用)。“
  • require说“如果这个尚未加载,那么load这个文件(立即)。“特别是

请注意,你不需要使用require加载库;这只是你保证你不会加载它再次(假设你不想要的方式。这样做)库中的(provide 'FEATURE)表达会无论库的加载方式进行评估,它可以让任何未来require知道,它不需要做任何事情

这对autoload类似的情况 - 如果该文件已被加载(因此正确定义的功能),然后是自动加载更长的时间有任何影响。

相关问题