我正試圖編程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