2008-10-21 16 views
15

Si j'ai une structure de dossiers mis en place comme ceci:Emacs Lisp: Comment ajouter un dossier et tous ses premiers sous-dossiers de niveau à la charge chemin

~/Projects 
    emacs 
     package1 
      package1-helpers 
     package2 
      package2-helpers 
      package2-more-helpers 
     package3 
      package3-helpers 

Comment puis-je ajouter ces dossiers:

  • ~/Projets/emacs
  • ~/Projets/emacs/pACKAGE1
  • ~/Projets/emacs/package2
  • ~/Projets/emacs/package3

... au load-path à partir de mon fichier .emacs?

J'ai besoin essentiellement une version courte 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") 

Répondre

17
(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))))) 
+0

Merci Jouni! Malheureusement, une erreur est survenue: "Une erreur s'est produite lors du chargement de' c: /Users/Alex/AppData/Roaming/.emacs ': La définition de la fonction de symbole est vide: do ". J'ai Emacs 22.2.1 fonctionnant sous Vista. –

+0

Oops - "do" est en cl.el, donc vous pouvez faire fonctionner la suggestion originale en ajoutant "(require cl)" au début. Mais j'ai modifié la réponse pour utiliser dolist, ce qui à la fois simplifie et évite le besoin de cl.el. –

+0

Fonctionne comme un charme, merci beaucoup! –

10

Voici quelque chose que je l'utilise dans mon .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 regardez la description de normal-top-level-add-subdirs-to-load-path, c'est un peu t choisir les répertoires à exclure.

+1

Notez que ce code inclut également les sous-répertoires de /.elisp. –

2

Ceci est ma version piraté jusqu'à: 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)) 

Cela ajoutera tous les premiers dirs niveau de la base et d'exclure ceux en exclure liste, tandis que pour les dirs en comprennent-liste, il ajoutera tout le premier niveau dirs de ce dir aussi.

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

Cette fonction carte par rapport au premier sous-dossiers de niveau et les fichiers dans la base-PATH et l'ajouter à la charge-LIST si elle est un répertoire (à l'exception des 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))) 
+0

Veuillez donner quelques explications à votre réponse. Les réponses au code seulement ne sont pas appréciées –

1

Installer dash et f bibliothèques tierces. Votre fonction est nécessaire f-directories:

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

Utilisez ensuite --each pour ajouter chaque répertoire trouvé load-path. Toute cette opération fonctionne en O (n²), mais comme load-path est habituellement super-petit, on s'en fout.

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