我熟悉load-path
和require
,但我想知道是否可以将 init.el 中的多个require
语句合并为某种类型循环,最终做了require
之类的事情 - 给定目录中的所有文件。
有没有办法做到这一点?或者我应该保持原样,有多个require
语句?
答案 0 :(得分:3)
我同意Drew你想在这种情况下使用load
。这个函数基于Drew的代码,有一些调整,以避免在存在.el和.elc版本时重新加载库。
(defun my-load-all-in-directory (dir)
"`load' all elisp libraries in directory DIR which are not already loaded."
(interactive "D")
(let ((libraries-loaded (mapcar #'file-name-sans-extension
(delq nil (mapcar #'car load-history)))))
(dolist (file (directory-files dir t ".+\\.elc?$"))
(let ((library (file-name-sans-extension file)))
(unless (member library libraries-loaded)
(load library nil t)
(push library libraries-loaded))))))
答案 1 :(得分:2)
(let ((loaded (mapcar #'car load-history)))
(dolist (file (directory-files "~/.emacs.d" t ".+\\.elc?$"))
(unless (catch 'foo
(dolist (done loaded)
(when (equal file done) (throw 'foo t)))
nil)
(load (file-name-sans-extension file))
(push file loaded))))
load
,而不是require
,因为功能名称(来自provide
)不一定与文件的基本名称相同。或者该文件甚至可能不是provide
一个功能。答案 2 :(得分:1)
您可以尝试这样的事情:
(mapc (lambda (name)
(require (intern (file-name-sans-extension name))))
(directory-files ".emacs.d" nil "\\.el$"))
说明:
directory-files
file-name-sans-extension
intern
和require