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

Если у меня настроена такая структура папок:

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

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

  • ~ / Проекты / emacs
  • ~ / Проекты / emacs / package1
  • ~ / Проекты / emacs / package2
  • ~ / Проекты / emacs / package3

... в 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")

person Alexander Kojevnikov    schedule 21.10.2008    source источник


Ответы (6)


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

Если вы посмотрите на описание normal-top-level-add-subdirs-to-load-path, вы поймете, какие каталоги следует исключить, с умом.

person Nicholas Riley    schedule 31.03.2009

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

person link0ff    schedule 21.10.2008

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

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

(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))
person Sujoy    schedule 04.10.2009

Эта функция будет отображать подпапки и файлы первого уровня в BASE-PATH и добавлять их в LOAD-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)))
person El Queso Grande    schedule 25.09.2014
comment
Пожалуйста, объясните свой ответ. Ответы только на код не приветствуются - person Sulthan Allaudeen; 25.09.2014

Установите 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))
person Mirzhan Irkegulov    schedule 23.02.2015

person    schedule
comment
Спасибо, Джоуни! К сожалению, я получаю сообщение об ошибке: произошла ошибка при загрузке `c: /Users/Alex/AppData/Roaming/.emacs ': определение функции символа недействительно: do. У меня Emacs 22.2.1 работает под Vista. - person Alexander Kojevnikov; 21.10.2008
comment
Упс - do находится в cl.el, поэтому вы можете заставить исходное предложение работать, добавив (require cl) в начале. Но я изменил ответ, чтобы использовать dolist, что упростило его и избавило от необходимости использовать cl.el. - person Jouni K. Seppänen; 21.10.2008