Emacs - 需要目录中的所有文件

时间:2013-09-09 20:12:28

标签: emacs directory elisp require

我熟悉load-pathrequire,但我想知道是否可以将 init.el 中的多个require语句合并为某种类型循环,最终做了require之类的事情 - 给定目录中的所有文件。

有没有办法做到这一点?或者我应该保持原样,有多个require语句?

3 个答案:

答案 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$"))

说明:

  1. 使用directory-files
  2. 检索elisp文件列表
  3. 使用file-name-sans-extension
  4. 删除扩展程序
  5. 使用internrequire
  6. 获取与文件基本名称相关联的符号