如果我的文件夹结构设置如下:
~/Projects
emacs
package1
package1-helpers
package2
package2-helpers
package2-more-helpers
package3
package3-helpers
如何添加这些文件夹:
...从我的.emacs文件到load-path
?
我基本上需要这段代码的简短自动化版本:
(add-to-list 'load-path "~/Projects/emacs")
(add-to-list 'load-path "~/Projects/emacs/package1")
(add-to-list 'load-path "~/Projects/emacs/package2")
(add-to-list 'load-path "~/Projects/emacs/package3")
答案 0 :(得分:17)
(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)))))
答案 1 :(得分:10)
这是我在.emacs中使用的东西:
(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))
如果你看一下normal-top-level-add-subdirs-to-load-path的描述,那么选择要排除的目录有点聪明。
答案 2 :(得分:5)
我建议您使用subdirs.el
答案 3 :(得分:2)
这是我的黑客版本:P
(defun add-to-list-with-subdirs (base exclude-list include-list)
(dolist (f (directory-files base))
(let ((name (concat base "/" f)))
(when (and (file-directory-p name)
(not (member f exclude-list)))
(add-to-list 'load-path name)
(when (member f include-list)
(add-to-list-with-subdirs name exclude-list include-list)))))
(add-to-list 'load-path base))
这将从base添加所有第一级dirs并排除exclude-list中的dirs,而对于include-list中的dirs,它也将添加该dir的所有第一级目录。
(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))
答案 4 :(得分:1)
此函数将映射BASE-PATH中的第一级子文件夹和文件,如果它是目录(不包括目录“。”和“..”),则将其添加到LOAD-LIST。
(defun add-subdirs-to-load-path (base-path)
"Adds first level subfolders to LOAD-PATH.
BASE-PATH must not end with a '/'"
(mapc (lambda (attr)
(let ((name (car attr))
(folder-p (cadr attr)))
(unless (or (not folder-p)
(equal name ".")
(equal name ".."))
(add-to-list 'load-path (concat base-path "/" name)))))
(directory-files-and-attributes base-path)))
答案 5 :(得分:1)
安装dash
和f
第三方库。您需要的功能是f-directories
:
(f-directories "~/YOURDIR") ; return only immediate directories
(f-directories "~/YOURDIR" nil t) ; all directories recursively
然后使用--each
将每个找到的目录添加到load-path
。整个操作在O(n²)中工作,但load-path
通常超小,谁在乎。
(add-to-list 'load-path "~/YOURDIR") ; your parent folder itself
(--each (f-directories "~/YOURDIR") (add-to-list 'load-path it))