Як шляхи до файлів відображаються до підкаталогів у .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)))

На жаль, жоден із них також не працює.

Відповіді:


7

Виходячи з документації в посібнику , ви пропускаєте частину специфікації subdir.

Зразок .dir-localals.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-localals.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))))

Я неправильно зрозумів цей приклад в документалітоні, дякую за пояснення цього. Однак я спробував вашу версію (copy-paste), і вона все ще веде себе так само. Навіть з '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. Дуже дякую.
nert

1
Це дивно. Я зробив тест сьогодні, використовуючи, ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))і він працював належним чином (запропоновано встановити локальний var на нуль). Можливо, спробуйте помістити кореневі над специфікаціями субресурсу в списку, можливо, він встановить його за останнім знайденим значенням.
Джонатан Ліч-Пепін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.