Emacs Lisp: Comment ajouter un dossier et tous ses sous-dossiers de premier niveau au chemin de chargement

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

  •  03-07-2019
  •  | 
  •  

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")
Était-ce utile?

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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top