Wie werden Dateipfade Unterverzeichnissen in .dir-Locations.el zugeordnet?

10

Ich mag die Idee von .dir-locals.el. Ich habe meine eigene .dir-locals.elDatei in meinem Ausgangsverzeichnis, die alle Variablen für Verzeichnisse / Dateien festlegen soll, die ich öffne, es sei denn, es befindet sich .dir-locals.elnäher an dem Verzeichnis, in dem ich die Datei öffne. Obwohl die Datei erkannt wird, sind Verzeichnisvariablen für Unterverzeichnisse dies nicht wird auf geöffnete Dateien angewendet.

Das ist mein ~/.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))))

Wenn ich geöffnete Datei ~/dev/test/test.cdie Variable indent-tabs-modegesetzt ist tund c-basic-offsetist 8.

(describe-variable 'c-basic-offset)in dieser Datei sagt mir, dass es auf 8von eingestellt ist ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)In dieser Datei heißt es, dass sich value ( t) gerade im Standardzustand befindet.

Kann ich irgendwie das gewünschte Verhalten erreichen? Was mache ich falsch? Wie werden Dateipfade Unterverzeichnissen in zugeordnet ~/.dir-locals.el?

Bearbeiten:

Wie Jonathan vorschlug , versuchte ich auch:

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

und sogar was add-dir-local-variablehinzugefügt hat:

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

Leider funktioniert auch keines davon.

nert
quelle

Antworten:

7

Basierend auf der Dokumentation im Handbuch fehlt Ihnen ein Teil der Unterverzeichnisspezifikation.

Beispiel .dir-local.el

Aus dem Handbuch mit Kommentaren zur Hervorhebung / Klarstellung

(;; 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-local.el korrigiert

Dies basiert auf der Annahme, dass die subdirSpezifikationen für alle Modi gelten sollen. Wenn Sie nur sie anwenden möchten c-modeersetzen nilmit c-modeim Modus-Spezifikation.

(;; 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))))
Jonathan Leech-Pepin
quelle
Ich habe dieses Beispiel in der Dokumentation falsch verstanden, danke, dass Sie das klargestellt haben. Ich habe jedoch Ihre Version ausprobiert (Kopieren und Einfügen) und sie verhält sich immer noch genauso. Auch mit 'emacs -Q'. Vorschläge zum Debuggen sind ebenfalls willkommen.
Am
Ich habe auch versucht, es zu verwenden, add-dir-local-variableund es wurde ~/.dir-locals.elmit einer noch kürzeren Syntax hinzugefügt, als ich in der Frage verwendet habe : ("dev/test" (indent-tabs-mode)). Funktioniert aber immer noch nicht.
Am
Ich denke, meiner Version fehlten einige Parens, ich habe sie hinzugefügt (im Vergleich zur Stichprobe habe ich sie mir angesehen und es hätte zusätzliche um die Subdir-Spezifikationen geben sollen("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin
Ja das funktioniert Das einzige Problem ist jetzt, dass die Modusvariablen Vorrang vor den Verzeichnisvariablen haben, aber da sie nur mit dem c-Modus zusammenhängen, kann ich sie während der Initialisierung mit setq-default festlegen. Vielen Dank.
Am
1
Das ist merkwürdig. Ich habe heute einen Test mit durchgeführt ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))und er hat ordnungsgemäß funktioniert (aufgefordert, die lokale Variable auf Null zu setzen). Versuchen Sie vielleicht, die Root-Werte über die Unterverzeichnis-Spezifikationen in der Liste zu setzen. Möglicherweise wird sie auf den zuletzt gefundenen Wert gesetzt.
Jonathan Leech-Pepin