Bagaimana jalur file dipetakan ke subdirektori di .dir-locals.el?

10

Saya suka ide .dir-locals.el. Saya memiliki .dir-locals.elfile saya sendiri di direktori home saya yang harus mengatur semua variabel untuk direktori / file yang saya buka kecuali ada .dir-locals.ellebih dekat ke direktori saya membuka file. Namun, meskipun file tersebut dikenali, variabel direktori untuk subdirektori tidak diterapkan pada file yang dibuka.

Ini milik saya ~/.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))))

Ketika saya buka file ~/dev/test/test.cvariabel indent-tabs-modediatur ke tdan c-basic-offsetadalah 8.

(describe-variable 'c-basic-offset)dalam file itu memberitahu saya itu diatur 8dari ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)dalam file itu mengatakan nilainya ( t) hanya dalam keadaan default.

Bisakah saya mencapai perilaku yang diinginkan? Apa yang saya lakukan salah? Bagaimana jalur file dipetakan ke subdirektori ~/.dir-locals.el?

Edit:

Seperti yang disarankan Jonathan , saya juga mencoba:

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

dan bahkan apa yang add-dir-local-variableditambahkan:

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

Sayangnya, tidak satu pun yang berfungsi.

nert
sumber

Jawaban:

7

Berdasarkan dokumentasi dalam manual , Anda kehilangan sebagian dari spesifikasi subdir.

Contoh .dir-locals.el

Dari manual dengan komentar untuk penekanan / klarifikasi

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

Dikoreksi .dir-locals.el

Ini didasarkan pada asumsi bahwa Anda ingin subdirspesifikasi berlaku untuk semua mode. Jika Anda hanya ingin mereka menerapkan untuk c-modemenggantikan nildengan c-modedalam mode-spesifikasi.

(;; 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
sumber
Saya salah mengerti contoh itu di dokumen, terima kasih telah menjelaskannya. Namun, saya mencoba versi Anda (copy-paste) dan masih berlaku dengan cara yang sama. Bahkan dengan 'emacs -Q'. Saran untuk debugging juga disambut.
tgl
Saya juga mencoba menggunakan add-dir-local-variabledan itu ditambahkan ke ~/.dir-locals.eldengan sintaks bahkan lebih pendek daripada yang saya digunakan dalam pertanyaan: ("dev/test" (indent-tabs-mode)). Tapi tetap saja tidak berhasil.
tgl
Saya pikir versi saya kehilangan beberapa parens, saya telah menambahkannya (melihat dibandingkan dengan sampel dan seharusnya ada yang tambahan di sekitar spesifikasi subdir("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin
Ya itu berhasil! Satu-satunya masalah sekarang adalah bahwa variabel mode didahulukan dari yang direktori, tetapi karena mereka hanya terkait dengan c-mode saya dapat mengaturnya dengan setq-default selama init. Terima kasih banyak.
nert
1
Itu aneh. Saya melakukan tes hari ini menggunakan ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))dan itu berfungsi dengan baik (diminta untuk mengatur var lokal ke nol). Mungkin mencoba meletakkan yang root di atas spesifikasi sub-dir dalam daftar, mungkin ia menetapkannya ke nilai terakhir yang ditemukan.
Jonathan Leech-Pepin