2009-04-26 13 views
5

La pregunta es similar a one.No se puede agregar un directorio y todos sus subdirectorios a la ruta de carga en Emacs

Sin embargo, difiere en poner todos los subdirectorios alcanzables en la carpeta también.

código de Jouni que pone carpetas de primer nivel alcanzable

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

Cómo se puede poner un directorio y todos sus subdirectorios para cargar-ruta en Emacs?

Respuesta

9

Mi answer en la otra pregunta maneja múltiples niveles de subdirectorios.

El código de referencia

(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: Gracias por señalarlo! –

+0

Soy bastante nuevo en Lisp. ¿Qué significa * en tu código? –

+0

@Nicholas: ¿Por qué usas la estrella? –

1

Aquí es una adaptación de la respuesta de Jouni que utiliza una función auxiliar que se puede adaptar.

Una ventaja de la función auxiliar es que puede rastrear cuando hace algo inesperado, porque es una función pura, por lo que no tiene efectos secundarios en la ruta de carga. Intenté usar la ruta normal-nivel-superior-agregar-subdirectorios-a-carga, pero todo en ella es tan secundario y dependiente de variables especiales impredecibles, que era más fácil escribir algo nuevo que estaba limpio. Tenga en cuenta que mi respuesta no utiliza inodos, por lo que puede ser menos eficiente.

Una segunda ventaja de este enfoque es que le permite adaptar los archivos que desea ignorar.

 
(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

Respuesta simple:

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