Come vengono mappati i percorsi dei file nelle sottodirectory in .dir-locals.el?


10

Mi piace l'idea di .dir-locals.el. Ho il mio .dir-locals.elfile nella mia directory home che dovrebbe impostare tutte le variabili per directory / file che apro a meno che non ci sia .dir-locals.elpiù vicino alla directory in cui apro il file. Tuttavia, anche se il file è riconosciuto, le variabili di directory per le sottodirectory non lo sono applicato ai file aperti.

Questo è il mio ~/.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))))

Quando apro il file ~/dev/test/test.cla variabile indent-tabs-modeè impostata su ted c-basic-offsetè 8.

(describe-variable 'c-basic-offset)in quel file mi dice che è impostato 8da ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)in quel file dice che value ( t) è solo nel suo stato predefinito.

Posso in qualche modo ottenere il comportamento desiderato? Che cosa sto facendo di sbagliato? Come vengono mappati i percorsi dei file alle sottodirectory ~/.dir-locals.el?

Modificare:

Come suggerito Jonathan , ho anche provato:

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

e anche ciò che ha add-dir-local-variableaggiunto:

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

Sfortunatamente, nessuno di questi funziona neanche.

Risposte:


7

Sulla base della documentazione nel manuale , manca una parte delle specifiche del subdir.

Esempio .dir-locals.el

Dal manuale con commenti per enfasi / chiarimento

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

.Dir-locals.el corretto

Questo si basa sul presupposto che si desidera subdirapplicare le specifiche a tutte le modalità. Se desideri solo che vengano applicati per c-modesostituirli nilcon c-modele specifiche della modalità.

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

Ho frainteso questo esempio nel documentaiton, grazie per averlo chiarito. Tuttavia, ho provato la tua versione (copia-incolla) e si comporta ancora allo stesso modo. Anche con 'emacs -Q'. Anche i suggerimenti per il debug sono i benvenuti.
nert

Ho anche provato ad utilizzare add-dir-local-variableed è stato aggiunto alla ~/.dir-locals.elsintassi ancora più breve che ho usato nella questione: ("dev/test" (indent-tabs-mode)). Tuttavia non funziona ancora.
nert

Penso che alla mia versione mancassero alcune parentesi, le ho aggiunte (osservandole rispetto al campione e ce ne sarebbero state altre in giro per le specifiche dei sottodiretti("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin,

Sì, funziona! L'unico problema ora è che le variabili di modalità hanno la precedenza su quelle della directory, ma poiché sono correlate solo a c-mode, posso impostarle con setq-default durante init. Grazie mille.
nert

1
È strano. Ho fatto un test oggi usando ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))e ha funzionato correttamente (richiesto di impostare var locale su zero). Forse prova a mettere quelli root sopra le specifiche della sottodirectory nell'elenco, è possibile che lo imposti sull'ultimo valore trovato.
Jonathan Leech-Pepin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.