Невозможно добавить каталог и все его подкаталоги в путь загрузки в Emacs - PullRequest
5 голосов
/ 27 апреля 2009

Вопрос похож на один .

Тем не менее, он отличается тем, что помещает все подкаталоги, достижимые в папке.

Код Джоуни, который делает достижимыми папки первого уровня

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

Как вы можете поместить каталог и все его подкаталоги в путь загрузки в Emacs?

Ответы [ 3 ]

9 голосов
/ 27 апреля 2009

Мой ответ в другом вопросе обрабатывает несколько уровней подкаталогов.

Код для справки

(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))
1 голос
/ 09 марта 2010

Вот адаптация ответа Джоуни, в которой используется вспомогательная функция, которую вы можете адаптировать.

Одним из преимуществ вспомогательной функции является то, что вы можете отследить ее, когда она делает что-то неожиданное, потому что это чистая функция, поэтому она не оказывает побочного эффекта на ваш путь загрузки. Я пытался использовать обычный верхний уровень-add-subdirs-to-load-path, но все в нем настолько побочно и зависит от непредсказуемых специальных переменных, что было просто легче написать что-то свежее, чистое. Обратите внимание, что в моем ответе не используются inode, поэтому он может быть менее эффективным.

Вторым преимуществом этого подхода является то, что он позволяет настроить файлы, которые вы хотели бы игнорировать.

(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 голосов
/ 15 января 2011

Простой ответ:

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