2014-01-06 36 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類似的情況 - 如果該文件已被加載(因此正確定義的功能),然後是自動加載更長的時間有任何影響。