2008-10-21 1 views
15

Если у меня есть структура папок настроить так:Emacs Lisp: Как добавить папку и все ее подпапки первого уровня для нагрузки пути

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

Как добавить эти папки:

  • ~/Проекты/Emacs
  • ~/Проекты/Emacs/упаковке1
  • ~/Проекты/Emacs/package2
  • ~/Проекты/Emacs/упаковке3

... к load-path из моего файла .emacs?

Я в основном нужен короткий автоматизированный вариант этого кода:

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

ответ

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

Thanks Jouni! К сожалению, я получаю сообщение об ошибке: «Произошла ошибка при загрузке` c: /Users/Alex/AppData/Roaming/.emacs ': Определение функции символа пусто: do ". У меня Emacs 22.2.1 работает под Vista. – 2008-10-21 12:05:50

+0

Упс - «do» находится в cl.el, поэтому вы можете сделать оригинальное предложение, добавив «(require cl)» в начале. Но я изменил ответ на использование долиста, что делает его более простым и позволяет избежать необходимости в cl.el. – 2008-10-21 13:02:05

+0

Работает как очарование, огромное спасибо! – 2008-10-21 13:13:38

4

Я предлагаю вам использовать subdirs.el

+0

Полезно знать, спасибо! – 2008-10-21 22:33:10

10

Вот что-то я использую в моих .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)) 

Если вы посмотрите описание для нормального-верхнего уровня-add-subdirs-to-load-path, это несколько умный abou t выбрать, какие каталоги будут исключать.

2

Это моя изрубили версия: 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)) 

Это добавит все первые каталоги уровня из базы и исключить те, в исключении-списке, а для каталогов в включают список, то это добавит все на первом уровне.

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

Эта функция будет отображать более первого уровня вложенных папок и файлов в BASE-PATH и добавить его к грузу-LIST, если это каталог (за исключением каталогов «» и «..»).

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

Установите dash и f сторонних библиотек. Ваша нужна функция f-directories:

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

Затем используйте --each, чтобы добавить каждый найденный каталог в load-path. Вся эта операция работает в O (n²), но как load-path, как правило, очень маленькая, кому это интересно.

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

 Смежные вопросы

  • Нет связанных вопросов^_^