Как пути файлов отображаются в подкаталогах в .dir-locals.el?

10

Мне нравится идея .dir-locals.el. У меня есть собственный .dir-locals.elфайл в моем домашнем каталоге, в котором должны быть установлены все переменные для каталогов / файлов, которые я открываю, если только нет места .dir-locals.elближе к каталогу, в котором я открываю файл. Однако, даже если файл распознан, переменные каталога для подкаталогов не являются применяется к открытым файлам.

Это мое ~/.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))))

Когда я открываю файл, ~/dev/test/test.cпеременная indent-tabs-modeустанавливается на tи c-basic-offsetесть 8.

(describe-variable 'c-basic-offset)в этом файле говорит мне, что он установлен 8с ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)в этом файле говорится, что значение ( t) просто в состоянии по умолчанию.

Можно ли как-то добиться желаемого поведения? Что я делаю неправильно? Как пути файлов отображаются в подкаталогах в ~/.dir-locals.el?

Редактировать:

Как предположил Джонатан , я также попробовал:

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

и даже что add-dir-local-variableдобавил:

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

К сожалению, ничего из этого тоже не работает.

Nert
источник

Ответы:

7

Основываясь на документации в руководстве , вам не хватает части спецификации subdir.

Образец .dir-locals.el

Из руководства с комментариями для выделения / уточнения

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

Это основано на предположении, что вы хотите, чтобы subdirспецификации применялись ко всем режимам. Если вы хотите их применять для c-modeзамены nilс c-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))))
Джонатан Лич-Пепин
источник
Я неправильно понял этот пример в документе, спасибо за разъяснение этого. Тем не менее, я попробовал вашу версию (копировать-вставить), и она по-прежнему ведет себя так же. Даже с 'emacs -Q'. Предложения по отладке тоже приветствуются.
Nert
Я также попытался с помощью add-dir-local-variableи он был добавлен ~/.dir-locals.elс еще более коротким , чем синтаксисом я в этом вопросе: ("dev/test" (indent-tabs-mode)). Тем не менее, не работает, хотя.
Nert
Я думаю, что в моей версии отсутствовали некоторые парены, я добавил их (просматривая их по сравнению с образцом, и должно было быть несколько дополнительных по спецификациям subdir("dev/test" . ((spec1 ...) (spec2 ...) ...))
Джонатан Лич-Пепин
Да, это работает! Единственная проблема сейчас состоит в том, что переменные режима имеют приоритет над каталогами, но, поскольку они относятся только к c-режиму, я могу установить их с помощью setq-default во время init. Большое спасибо.
больно
1
Это странно. Я сделал сегодня тест с использованием, ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))и он работал правильно (предложено установить локальную переменную в ноль). Может быть, попытаться поместить корневые над спецификациями sub-dir в списке, возможно, он установит для него последнее найденное значение.
Джонатан Лич-Пепин