15

如果我有这样的文件夹结构:

~/Projects
    emacs
        package1
            package1-helpers
        package2
            package2-helpers
            package2-more-helpers
        package3
            package3-helpers

如何添加这些文件夹:

  • ~/项目/emacs
  • ~/项目/emacs/package1
  • ~/项目/emacs/package2
  • ~/项目/emacs/package3

...load-path从我的 .emacs 文件?

我基本上需要这段代码的简短自动化版本:

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

6 回答 6

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)))))
于 2008-10-21T10:53:45.647 回答
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 的描述,选择要排除的目录有点聪明。

于 2009-03-31T17:58:32.243 回答
5

我建议你使用subdirs.el

于 2008-10-21T14:37:42.717 回答
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))

这将从基础添加所有第一级目录并排除排除列表中的目录,而对于包含列表中的目录,它也会添加该目录的所有第一级目录。

(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))
于 2009-10-04T08:56:37.087 回答
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)))
于 2014-09-25T04:11:52.520 回答
1

安装dashf第三方库。您需要的功能是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))
于 2015-02-23T23:52:17.603 回答