Các đường dẫn tệp được ánh xạ tới các thư mục con trong .dir-locals.el như thế nào?


10

Tôi thích ý tưởng của .dir-locals.el. Tôi có .dir-locals.eltệp riêng trong thư mục chính của mình nên đặt tất cả các biến cho thư mục / tệp mà tôi mở trừ khi có .dir-locals.elgần thư mục tôi mở tệp hơn. Tuy nhiên, mặc dù tệp được nhận dạng, các biến thư mục cho thư mục con không áp dụng cho các tập tin đã mở.

Đây là của tôi ~/.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))))

Khi tôi mở tập tin ~/dev/test/test.c, biến indent-tabs-modeđược đặt thành tc-basic-offset8.

(describe-variable 'c-basic-offset)trong tập tin đó cho tôi biết nó được đặt thành 8từ ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)trong tệp đó cho biết giá trị của nó ( t) chỉ ở trạng thái mặc định.

Tôi có thể bằng cách nào đó đạt được hành vi mong muốn? Tôi đang làm gì sai? Đường dẫn tệp được ánh xạ tới các thư mục con trong ~/.dir-locals.elnhư thế nào?

Biên tập:

Như Jonathan đề nghị , tôi cũng đã thử:

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

và thậm chí những gì add-dir-local-variableđã thêm:

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

Thật không may, không ai trong số họ làm việc cả.

Câu trả lời:


7

Dựa trên tài liệu trong hướng dẫn , bạn đang thiếu một phần của đặc tả kỹ thuật phụ.

Mẫu .dir-locals.el

Từ hướng dẫn với các ý kiến ​​để nhấn mạnh / làm rõ

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

Đã sửa .dir-locals.el

Điều này dựa trên giả định rằng bạn muốn các subdirthông số kỹ thuật áp dụng cho tất cả các chế độ. Nếu bạn chỉ muốn áp dụng chúng để c-modethay thế nilbằng c-modetrong đặc tả chế độ.

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

Tôi đã hiểu nhầm ví dụ đó trong tài liệu, cảm ơn bạn đã làm rõ điều đó. Tuy nhiên, tôi đã thử phiên bản của bạn (sao chép-dán) và nó vẫn hoạt động theo cùng một cách. Ngay cả với 'emacs -Q'. Đề xuất để gỡ lỗi cũng được hoan nghênh.
nert

Tôi cũng đã thử sử dụng add-dir-local-variablevà nó đã được thêm vào ~/.dir-locals.elvới cú pháp thậm chí ngắn hơn tôi đã sử dụng trong câu hỏi : ("dev/test" (indent-tabs-mode)). Vẫn không làm việc, mặc dù.
nert

Tôi nghĩ rằng phiên bản của tôi bị thiếu một số parens, tôi đã thêm chúng vào (nhìn qua so với mẫu và đáng lẽ phải có thêm những cái khác xung quanh thông số kỹ thuật phụ("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin

Vâng, nó hoạt động! Vấn đề duy nhất bây giờ là các biến chế độ được ưu tiên hơn các biến thư mục, nhưng vì chúng chỉ liên quan đến chế độ c nên tôi có thể đặt chúng với setq-default trong init. Cảm ơn rât nhiều.
nert

1
Điều đó thật lạ. Tôi đã thực hiện một thử nghiệm ngày hôm nay bằng cách sử dụng ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))và nó hoạt động đúng (được nhắc đặt var cục bộ thành nil). Có thể thử đặt những cái gốc bên trên các đặc tả của thư mục con trong danh sách, có thể nó đặt nó thành giá trị cuối cùng được tìm thấy.
Jonathan Leech-Pepin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.