代码之家  ›  专栏  ›  技术社区  ›  Alexander Kojevnikov

Emacs Lisp:如何将文件夹及其所有第一级子文件夹添加到加载路径

  •  15
  • Alexander Kojevnikov  · 技术社区  · 17 年前

    如果我的文件夹结构设置如下:

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

    如何添加这些文件夹:

    • ~/Projects/emacs/package1
    • ~/Projects/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")
    
    6 回复  |  直到 17 年前
        1
  •  17
  •   Jouni K. Seppänen    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)))))
    
        2
  •  10
  •   Nicholas Riley    17 年前

    以下是我在.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))
    

    如果您查看普通顶级添加子目录到加载路径的描述,那么选择要排除的目录有点明智。

        3
  •  5
  •   link0ff    17 年前

    我建议你使用 subdirs.el

        4
  •  2
  •   Sujoy    16 年前

    (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"))
    
        5
  •  1
  •   El Queso Grande    12 年前

    此函数将映射基本路径中的第一级子文件夹和文件,如果是目录(不包括目录“.”和“.”),则将其添加到加载列表中。

    (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)))
    
        6
  •  1
  •   Mirzhan Irkegulov    11 年前

    安装 dash f f-directories

    (f-directories "~/YOURDIR") ; return only immediate directories
    (f-directories "~/YOURDIR" nil t) ; all directories recursively
    

    然后使用 --each 将找到的每个目录添加到 load-path 加载路径

    (add-to-list 'load-path "~/YOURDIR") ; your parent folder itself
    (--each (f-directories "~/YOURDIR") (add-to-list 'load-path it))