5

这个问题类似于一个

但是,将所有可实现的子目录也放入文件夹中是不同的。

Jouni 的代码可以实现第一级文件夹

(let ((base "~/Projects/emacs"))
  (add-to-list 'load-path base)
  (dolist (f (directory-files base))
    (let ((name (concat base "/" f)))
      (when (and (file-directory-p name) 
                 (not (equal f ".."))
                 (not (equal f ".")))
        (add-to-list 'load-path name)))))

如何在 Emacs 中将目录及其所有子目录放入 load-path?

4

3 回答 3

9

我在另一个问题中的回答确实处理了多个级别的子目录。

参考代码

(let* ((my-lisp-dir "~/.elisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))
于 2009-04-27T00:12:40.397 回答
1

这是对 Jouni 答案的改编,它使用了您可以定制的辅助函数。

辅助函数的一个优点是您可以在它发生意外时跟踪它,因为它是一个纯函数,因此不会对您的加载路径产生副作用。我尝试使用 normal-top-level-add-subdirs-to-load-path,但其中的所有内容都非常有副作用,并且依赖于不可预测的特殊变量,因此编写干净的新鲜内容更容易。请注意,我的答案不使用 inode,因此可能效率较低。

这种方法的第二个优点是它可以让你定制你想忽略的文件。

(defun add-to-load-path-with-subdirs (directory & optional endp)
  (let ((newdirs (lp-subdir-list 目录)))
    (if endp (setq load-path (append load-path newdirs))
      (setq 加载路径 (nconc newdirs 加载路径)))))

(defconst +lp-忽略列表+
  (列表“CVS”“.git”“.svn”“..”“.”))

(defun lp-subdir-list (base &optional 忽略)
  (除非忽略
    (setq 忽略 +lp-ignore-list+))
  (让((待定(列表基数))
 (retval 无))
    (待定时
      (let ((dir (pop pending)))
 (推 dir retval)
 (dolist(f(目录文件目录))
   (let ((name (concat dir "/" f)))
     (when (and (not (member f ignore))
         (文件-目录-p 名称))
       (推送名称待定)
       (推送名称 retval))))))
    (反向 retval)))
于 2010-03-09T19:28:35.593 回答
0

简单的回答:

 (normal-top-level-add-subdirs-to-load-path)
于 2011-01-15T01:53:32.387 回答