¿Cómo se asignan las rutas de archivo a subdirectorios en .dir-locals.el?

10

Me gusta la idea de .dir-locals.el. Tengo mi propio .dir-locals.elarchivo en mi directorio de inicio que debe establecer todas las variables para los directorios / archivos que abro a menos que esté .dir-locals.elmás cerca del directorio en el que abro el archivo. Sin embargo, a pesar de que el archivo es reconocido, las variables de directorio para subdirectorios no son aplicado a los archivos abiertos.

Este es mi ~/.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))))

Cuando abro el archivo, ~/dev/test/test.cla variable indent-tabs-modese establece en ty c-basic-offsetes 8.

(describe-variable 'c-basic-offset)en ese archivo me dice que está configurado 8desde ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)en ese archivo dice que su valor ( t) está en su estado predeterminado.

¿Puedo de alguna manera lograr el comportamiento deseado? ¿Qué estoy haciendo mal? ¿Cómo se asignan las rutas de archivo a subdirectorios ~/.dir-locals.el?

Editar:

Como Jonathan sugirió , también probé:

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

e incluso lo que add-dir-local-variableagregó:

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

Desafortunadamente, ninguno de esos funciona tampoco.

nert
fuente

Respuestas:

7

Según la documentación del manual , le falta una parte de la especificación de subdirección.

Muestra .dir-locals.el

Del manual con comentarios para énfasis / aclaración

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

Esto se basa en el supuesto de que desea que las subdirespecificaciones se apliquen a todos los modos. Si solo desea que se apliquen para c-modereemplazar nilcon c-modeen la especificación de modo.

(;; 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
fuente
Entendí mal ese ejemplo en la documentación, gracias por aclarar eso. Sin embargo, probé su versión (copiar y pegar) y todavía se comporta de la misma manera. Incluso con 'emacs -Q'. Las sugerencias para la depuración también son bienvenidas.
Nert
También he intentado usar add-dir-local-variabley se añadió a ~/.dir-locals.ella sintaxis aún más corto de lo que solía en la pregunta: ("dev/test" (indent-tabs-mode)). Sin embargo, todavía no funciona.
Nert
Creo que a mi versión le faltaban algunos parens, los agregué (revisándolo en comparación con la muestra y debería haber habido más en torno a las especificaciones del subdirectorio("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin
Si, eso funciona! El único problema ahora es que las variables de modo tienen prioridad sobre las del directorio, pero como solo están relacionadas con el modo c, puedo configurarlas con setq-default durante init. Muchas gracias.
Nert
1
Eso es extraño. Hice una prueba hoy usando ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))y funcionó correctamente (se le solicitó establecer var local a cero). Tal vez intente colocar las raíz por encima de las especificaciones del subdirectorio dentro de la lista, es posible que lo establezca en el último valor encontrado.
Jonathan Leech-Pepin