Emacs Lisp: Comment ajouter un dossier et tous ses sous-dossiers de premier niveau au chemin de chargement
Question
Si j'ai une structure de dossiers configurée comme ceci:
~/Projects
emacs
package1
package1-helpers
package2
package2-helpers
package2-more-helpers
package3
package3-helpers
Comment puis-je ajouter ces dossiers:
- ~ / Projects / emacs
- ~ / Projects / emacs / package1
- ~ / Projects / emacs / package2
- ~ / Projects / emacs / package3
... vers le chemin de chargement
à partir de mon fichier .emacs?
J'ai essentiellement besoin d'une courte version automatisée de ce code:
(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")
La solution
(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)))))
Autres conseils
Voici quelque chose que j'utilise dans mes .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))
Si vous consultez la description de normal-top-level-add-subdirs-to-load-chemin, il est assez intelligent de choisir les répertoires à exclure.
Je vous suggère d'utiliser les sous-répertoires. el
Ceci est ma version piratée: 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))
Ceci ajoutera tous les répertoires de premier niveau de la base et exclura ceux de la liste d'exclusion, tandis que pour les répertoires de la liste d'inclusion, il ajoutera également tous les répertoires de premier niveau de ce répertoire.
(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))
Cette fonction mappera sur les sous-dossiers et fichiers de premier niveau de BASE-PATH et l’ajoutera à la liste LOAD-LIST s’il s’agit d’un répertoire (excluant les répertoires "." et "...").
(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)))
Installez tiret
et < a href = "https://github.com/rejeep/f.el" rel = "nofollow"> f
bibliothèques tierces. Votre fonction indispensable est répertoires-f
:
(f-directories "~/YOURDIR") ; return only immediate directories
(f-directories "~/YOURDIR" nil t) ; all directories recursively
Puis utilisez - each
pour ajouter chaque répertoire trouvé à chemin de chargement
. Toute cette opération fonctionne en O (n²), mais comme chemin de chargement
est généralement très petit, peu importe.
(add-to-list 'load-path "~/YOURDIR") ; your parent folder itself
(--each (f-directories "~/YOURDIR") (add-to-list 'load-path it))