【问题标题】:Unable to add a directory and all its subdirectories to load-path in Emacs无法将目录及其所有子目录添加到 Emacs 中的加载路径
【发布时间】:2009-04-26 23:19:57
【问题描述】:

问题类似于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 中将目录及其所有子目录放入 load-path?

【问题讨论】:

    标签: emacs lisp elisp


    【解决方案1】:

    我在另一个问题中的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))
    

    【讨论】:

    • @Nicholas:你为什么用星星?
    • let* 是许多嵌套 let 的简写,每个 let 绑定一个变量;常规的旧 let 一次绑定所有变量。因此,使用 let 而不是 let*,我无法在 default-directory 的绑定中引用 my-lisp-dir,因为它在 let 的主体之前不可用。
    • 要查看排除了哪些目录,请运行 C-h f normal-top-level-add-subdirs-to-load-path。
    • @Nicholas:你怎么能看到函数里面有什么,比如你上次评论的那个?
    • 如果您在帮助窗口中单击“startup.el”,您将转到函数的定义(假设它是用 elisp 编写的,而不是 C。)
    【解决方案2】:

    这是对 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 目录))) (if endp (setq load-path (append load-path newdirs)) (setq 加载路径 (nconc newdirs 加载路径))))) (defconst +lp-忽略列表+ (列表“CVS”“.git”“.svn”“..”“.”)) (defun lp-subdir-list (base &optional 忽略) (除非忽略 (setq 忽略 +lp-ignore-list+)) (让((待定(列表基数)) (retval 无)) (待定时 (let ((dir (pop pending))) (推 dir retval) (dolist(f(目录文件目录)) (let ((name (concat dir "/" f))) (when (and (not (member f ignore)) (文件-目录-p 名称)) (推送名称待定) (推送名称 retval)))))) (反向 retval)))

    【讨论】:

      【解决方案3】:

      简单回答:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多