Emacs Lisp: как добавить папку и все ее подпапки первого уровня в путь загрузки
Если у меня есть структура папок, настроенная так:
~/Projects
emacs
package1
package1-helpers
package2
package2-helpers
package2-more-helpers
package3
package3-helpers
Как добавить эти папки:
- ~/Проекты/Emacs
- ~/Проекты/Emacs/package1
- ~/Проекты/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")
Ответы
Ответ 1
(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)))))
Ответ 2
Здесь что-то я использую в своих .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, он несколько сообразителен в выборе того, какие каталоги должны исключаться.
Ответ 3
Я предлагаю вам использовать subdirs.el
Ответ 4
Это моя взломанная версия: 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))
Это добавит все исходные коды первого уровня из базы и исключит их из списка исключений, тогда как для dirs в include-list он добавит все источники первого уровня этого каталога.
(add-to-list-with-subdirs "~/.emacs.d" '("." ".." "backup") '("vendor" "my-lisp"))
Ответ 5
Эта функция будет отображать подпапки и файлы первого уровня в 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)))
Ответ 6
Установите 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))