2008-10-21 12 views
15

ben bu kadarını bir klasör yapısı varsa: Ben bu klasörleri eklerim nasılEmacs Lisp: yük yoluna bir klasör ve tüm birinci düzey alt klasörler nasıl eklenir

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

:

  • ~/Projeler/emacs
  • ~/Projeler/emacs/Paket1
  • ~/Projeler/emacs/package2
  • ~/Projeler/emacs/package3

... load-path, .emacs dosyasından? Benim .emacs kullandığımız şey

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

cevap

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

Teşekkürler Jouni! Maalesef bir hata mesajı alıyorum: "c: /Users/Alex/AppData/Roaming/.emacs" yüklenirken bir hata oluştu: Sembolün işlevi tanımı geçersiz: do ". Vista altında çalışan Emacs 22.2.1 var. –

+0

Oops - "do", cl.el dizinindedir, böylece başlangıçta "(cl gerektirir)" ilk öneri çalışmasını yapabilirsiniz. Ama her ikisini de daha basit hale getiren ve cl.el. –

+0

Bir çekicilik olarak çalışıyor, çok teşekkürler! –

10

kullanmak önermek oluyor:

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

Temelde bu kodun kısa otomatikleştirilmiş sürümü gerekir

Normal üst düzey alt-add-subdir-to-load yolunun açıklamasına bakarsanız, biraz akıllıdır. Hangi dizinlerin hariç tutulacağını seçer.

+1

Bu kodun /.elisp adresindeki alt dizinleri de içerdiğini unutmayın. –

2

Bu benim kadar kesmek versiyonu: P içinde dirs-listesini dahil için, hepsi katacak iken bu tabanından tüm ilk kademe dizininin ekleyebilir ve dışlamak-listede olanları hariç tutar

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

Bu direktifin ilk seviye dirsleri de.

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

Bu fonksiyon BASE-PATH ilk düzey alt klasörler ve dosyalar üzerinde harita ve bunun (".." "" dizinleri hariç ve) bir dizin ise YÜK-LİSTESİ ekleyecektir.

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

Lütfen cevabınıza bazı açıklamalar verin. Kod sadece cevaplar takdir edilmez –

1

dash ve f üçüncü parti kütüphaneleri yükleyin. Kişisel gerekli fonksiyon f-directories geçerli:

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

Sonra load-path her bulundu dizini eklemek için --each kullanın. Bütün bu operasyon O (n²) 'de çalışır, ancak load-path genellikle süper küçüktür, kimin umurunda.

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