Dosya yolları .dir-locals.el içindeki alt dizinlerle nasıl eşlenir?


10

Fikrini seviyorum .dir-locals.el. Ana dizinimde .dir-locals.eldosyayı açtığım dizine .dir-locals.eldaha yakın olmadığı sürece açtığım dizinler / dosyalar için tüm değişkenleri ayarlaması gereken kendi dosyam var . Dosya tanınsa bile, alt dizinler için dizin değişkenleri açılan dosyalara uygulanır.

Bu benim ~/.dir-locals.el:

(("dev/school" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 ("dev/test" .
  ((indent-tabs-mode . nil)
   (c-basic-offset . 4)))
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

Dosyayı açtığımda ~/dev/test/test.cdeğişken indent-tabs-modeolarak ayarlanır tve c-basic-offsetolur 8.

(describe-variable 'c-basic-offset)Bu dosya söylüyor o ayarlandığında 8dan ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)bu dosyada değeri ( t) sadece varsayılan durumunda olduğunu söylüyor .

İstenilen davranışı bir şekilde başarabilir miyim? Neyi yanlış yapıyorum? Dosya yolları alt dizinlere nasıl eşlenir ~/.dir-locals.el?

Düzenle:

As Jonathan önerdi , ben de denedim:

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  (nil . ((indent-tabs-mode . nil)
          (c-basic-offset . 4)))))

ve hatta add-dir-local-variableeklenenler:

(("dev/school"
  (indent-tabs-mode)
  (c-basic-offset . 4)))

Ne yazık ki, bunların hiçbiri de çalışmıyor.

Yanıtlar:


7

Kılavuzdaki belgelere dayanarak , alt dizin belirtiminin bir bölümünü kaçırıyorsunuz.

Örnek .dir-locals.el

Kılavuzdan vurgu / açıklama için yorumlarla

(;; Dir settings
 (nil . ((indent-tabs-mode . t)
         (fill-column . 80)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil)))
 ;; Subdir specification
 ("src/imported" .
  ;; Subdir settings
  ((nil . ((change-log-default-name
            . "ChangeLog.local"))))))

Düzeltilmiş .dir-locals.el

Bu, subdirspesifikasyonların tüm modlara uygulanmasını istediğiniz varsayımına dayanır . Yalnızca istiyorsanız bunları uygulamak c-modeyerine nilbirlikte c-modemod-şartnamede.

(;; dev/school subdir
 ("dev/school" .
  ;; dev/school specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; dev/test subdir
 ("dev/test" .
  ;; dev/test specification for all modes
  ((nil . ((indent-tabs-mode . nil)
           (c-basic-offset . 4)))))
 ;; c-mode specification for dir + subdirs
 (c-mode .
  ((c-file-style . "linux")
   (c-basic-offset . 8))))

Belgeselde bu örneği yanlış anladım, bunu açıkladığınız için teşekkür ederim. Ancak, sürümünüzü denedim (kopyala-yapıştır) ve yine de aynı şekilde davranıyor. 'Emacs -Q' ile bile. Hata ayıklama önerileri de memnuniyetle karşılanmaktadır.
nert

Ben de kullanarak çalıştı add-dir-local-variableve o eklendi ~/.dir-locals.elSöz kullanılandan daha da kısa sözdizimi ile: ("dev/test" (indent-tabs-mode)). Yine de çalışmıyor.
nert

Benim sürümüm bazı parens eksik olduğunu düşünüyorum, ben ekledim (örnek ile karşılaştırıldığında üzerinden bakmak ve altdiz özellikleri etrafında ekstra olanlar olmalı("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin

Evet, işe yarıyor! Şimdi tek sorun, mod değişkenlerinin dizin değişkenlerine göre önceliğe sahip olmalarıdır, ancak sadece c-moduyla ilişkili olduklarından, onları başlatma sırasında setq-default ile ayarlayabilirim. Çok teşekkür ederim.
nert

1
Bu garip. Bugün kullanarak bir test yaptım ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))ve düzgün çalıştı (yerel var nil ayarlamak istenir). Belki kökleri listenin alt-alt özelliklerinin üstüne koymayı deneyin, onu bulunan son değere ayarlayabilir.
Jonathan Leech-Pepin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.