Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs Lisp:如何将文件夹及其所有第一级子文件夹添加到加载路径_Emacs_Elisp - Fatal编程技术网

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

Emacs Lisp:如何将文件夹及其所有第一级子文件夹添加到加载路径,emacs,elisp,Emacs,Elisp,如果我的文件夹结构设置如下: ~/Projects emacs package1 package1-helpers package2 package2-helpers package2-more-helpers package3 package3-helpers 如何添加这些文件夹: ~/Projects/emacs ~/Projects/e

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

~/Projects
    emacs
        package1
            package1-helpers
        package2
            package2-helpers
            package2-more-helpers
        package3
            package3-helpers
如何添加这些文件夹:

  • ~/Projects/emacs
  • ~/Projects/emacs/package1
  • ~/Projects/emacs/package2
  • ~/Projects/emacs/package3
…从my.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")

我建议您使用

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

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

这是我的黑客版本: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"))

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

安装和安装第三方库。您需要的功能是:

然后使用将找到的每个目录添加到
加载路径
。整个操作在O(n²)下工作,但由于
加载路径通常非常小,谁在乎呢

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

谢谢Jouni!不幸的是,我收到了一个错误:“加载'c:/Users/Alex/AppData/Roaming/.emacs'时发生错误”:Symbol的函数定义为void:do”。我已经在Vista下运行了Emacs 22.2.1。Oops-“do”在cl.el中,因此您可以通过在开始处添加“(require cl)”使原始建议生效。但是我修改了答案,使用了dolist,这既使它更简单,又避免了cl.el的需要。请对你的答案做一些解释。只有代码的答案不受欢迎
(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)))
(f-directories "~/YOURDIR") ; return only immediate directories
(f-directories "~/YOURDIR" nil t) ; all directories recursively
(add-to-list 'load-path "~/YOURDIR") ; your parent folder itself
(--each (f-directories "~/YOURDIR") (add-to-list 'load-path it))