无法将目录及其所有子目录添加到Emacs中的加载路径

时间:2009-04-26 23:19:58

标签: emacs lisp elisp

问题类似于one

但是,它在将所有子目录都可以在文件夹中实现方面也有所不同。

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中的加载路径?

3 个答案:

答案 0 :(得分:9)

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

参考代码

(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))

答案 1 :(得分: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 directory)))
    (if endp (setq load-path (append load-path newdirs))
      (setq load-path (nconc newdirs load-path)))))

(defconst +lp-ignore-list+
  (list "CVS" ".git" ".svn" ".." "."))

(defun lp-subdir-list (base &optional ignore)
  (unless ignore
    (setq ignore +lp-ignore-list+))
  (let ((pending (list base))
 (retval nil))
    (while pending
      (let ((dir (pop pending)))
 (push dir retval)
 (dolist (f (directory-files dir))
   (let ((name (concat dir "/" f)))
     (when (and (not (member f ignore))
         (file-directory-p name))
       (push name pending)
       (push name retval))))))
    (reverse retval)))

答案 2 :(得分:0)

简单回答:

 (normal-top-level-add-subdirs-to-load-path)