Emacs Lisp:フォルダーとそのすべての第1レベルのサブフォルダーをロードパスに追加する方法

StackOverflow https://stackoverflow.com/questions/221365

  •  03-07-2019
  •  | 
  •  

質問

次のように設定されたフォルダー構造がある場合:

~/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

.... 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")
役に立ちましたか?

解決

(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で使用するものは次のとおりです。

(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の説明を見ると、除外するディレクトリを選択するのが多少賢明です。

これは私のハッキングされたバージョン: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からすべての第1レベルのディレクトリが追加され、exclude-listのディレクトリが除外されます。一方、include-listのディレクトリについては、そのディレクトリのすべての第1レベルのディレクトリが追加されます。

(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))

この関数は、BASE-PATHの第1レベルのサブフォルダーとファイルをマップし、ディレクトリ(ディレクトリ"。"と" .."を除く)の場合は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)))

ダッシュ および< href = "https://github.com/rejeep/f.el" rel = "nofollow"> f サードパーティライブラリ。必要な関数は f-directories

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

次に、 -each 見つかった各ディレクトリを load-path に追加します。この操作全体はO(n&#178;)で機能しますが、 load-path は通常非常に小さいため、気になります。

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