2009-04-26 4 views
5

La domanda è simile a one.Impossibile aggiungere una directory e tutte le relative sottodirectory a percorso di caricamento in Emacs

Tuttavia, differisce nel mettere tutte le sottodirectory realizzabili anche nella cartella.

codice di Jouni, che mette in primo piano le cartelle realizzabile

(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))))) 

Come si può mettere una directory e tutte le sue sottodirectory per caricare-path in Emacs?

risposta

9

Il mio answer nell'altra domanda gestisce più livelli di sottodirectory.

Il codice di riferimento

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

@Nicholas: Grazie per la segnalazione! –

+0

Sono piuttosto nuovo in Lisp. Cosa significa let * nel tuo codice? –

+0

@Nicholas: Perché usi la stella? –

1

Ecco un adattamento della risposta di Jouni che utilizza una funzione di supporto che è possibile personalizzare.

Un vantaggio della funzione di supporto è che è possibile rintracciarlo quando fa qualcosa di inaspettato, perché è una funzione pura, quindi non ha effetti collaterali sul percorso di carico. Ho provato ad usare il normale-top-level-add-subdirs-to-load-path, ma tutto in esso è così efficace e dipendente da variabili speciali imprevedibili, che è stato semplicemente più facile scrivere qualcosa di fresco che fosse pulito. Nota che la mia risposta non usa gli inode, quindi potrebbe essere meno efficiente.

Un secondo vantaggio di questo approccio è che consente di personalizzare i file che si desidera ignorare.

 
(defun add-to-load-path-with-subdirs (directory &optional endp) 
    (let ((newdirs (lp-subdir-list directory))) 
    (if endp (setq load-path (append load-path newdirs)) 
     (setq load-path (nconc newdirs load-path))))) 

(defconst +lp-ignore-list+ 
    (list "CVS" ".git" ".svn" ".." ".")) 

(defun lp-subdir-list (base &optional ignore) 
    (unless ignore 
    (setq ignore +lp-ignore-list+)) 
    (let ((pending (list base)) 
(retval nil)) 
    (while pending 
     (let ((dir (pop pending))) 
(push dir retval) 
(dolist (f (directory-files dir)) 
    (let ((name (concat dir "/" f))) 
    (when (and (not (member f ignore)) 
     (file-directory-p name)) 
     (push name pending) 
     (push name retval)))))) 
    (reverse retval))) 
0

Risposta semplice:

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