Comment les chemins d'accès aux fichiers sont-ils mappés aux sous-répertoires dans .dir-locals.el?

10

J'aime l'idée de .dir-locals.el. J'ai mon propre .dir-locals.elfichier dans mon répertoire personnel qui devrait définir toutes les variables pour les répertoires / fichiers que j'ouvre à moins qu'il n'y ait .dir-locals.elplus près du répertoire dans lequel j'ouvre le fichier. Cependant, même si le fichier est reconnu, les variables de répertoire pour les sous-répertoires ne sont pas appliqué aux fichiers ouverts.

C'est mon ~/.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))))

Lorsque j'ouvre un fichier, ~/dev/test/test.cla variable indent-tabs-modeest définie sur tet l' c-basic-offsetest 8.

(describe-variable 'c-basic-offset)dans ce fichier me dit qu'il est réglé sur à 8partir de ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)dans ce fichier indique que sa valeur ( t) est juste dans son état par défaut.

Puis-je en quelque sorte atteindre le comportement souhaité? Qu'est-ce que je fais mal? Comment les chemins d'accès aux fichiers sont-ils mappés aux sous-répertoires dans ~/.dir-locals.el?

Éditer:

Comme Jonathan l'a suggéré , j'ai également essayé:

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

et même ce qui a add-dir-local-variableajouté:

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

Malheureusement, aucun de ceux-ci ne fonctionne non plus.

nert
la source

Réponses:

7

Sur la base de la documentation du manuel , il manque une partie de la spécification de sous-répertoire.

Exemple .dir-locals.el

Extrait du manuel avec commentaires pour accentuation / clarification

(;; 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 corrigé

Ceci est basé sur l'hypothèse que vous souhaitez que les subdirspécifications s'appliquent à tous les modes. Si vous voulez seulement qu'ils s'appliquent pour c-moderemplacer nilavec c-modedans la spécification de mode.

(;; 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
la source
J'ai mal compris cet exemple dans la documentaiton, merci d'avoir clarifié cela. Cependant, j'ai essayé votre version (copier-coller) et elle se comporte toujours de la même manière. Même avec 'emacs -Q'. Les suggestions de débogage sont également les bienvenues.
2015
J'ai aussi essayé d' utiliser add-dir-local-variableet il a été ajouté à ~/.dir-locals.ella syntaxe même plus courte que je la question: ("dev/test" (indent-tabs-mode)). Mais ça ne marche toujours pas.
2015
Je pense que ma version manquait de parens, je les ai ajoutées (en les regardant par rapport à l'échantillon et il devrait y en avoir d'autres autour des spécifications du subdir("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin
Oui, ça marche! Le seul problème maintenant est que les variables de mode ont priorité sur celles du répertoire, mais comme elles ne sont liées qu'au mode c, je peux les définir avec setq-default pendant init. Merci beaucoup.
2015
1
C'est étrange. J'ai fait un test aujourd'hui en utilisant ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))et cela a fonctionné correctement (invité à définir la variable locale sur nil). Essayez peut-être de placer les racines au-dessus des spécifications des sous-répertoires dans la liste, il est possible qu'il les définisse sur la dernière valeur trouvée.
Jonathan Leech-Pepin