.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-modetc-basic-offset로 설정됩니다 8.

(describe-variable 'c-basic-offset)이 파일 8에서 from 로 설정되어 있다고 알려줍니다 ~/.dir-locals.el.

(describe-variable 'indent-tabs-mode)그 파일에서 그 값 ( t)은 기본 상태에 있다고 말합니다 .

어떻게 든 원하는 행동을 할 수 있습니까? 내가 무엇을 잘못하고 있지? 파일 경로는 하위 디렉토리에 ~/.dir-locals.el어떻게 매핑 됩니까?

편집하다:

Jonathan이 제안한 대로 시도했습니다.

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

매뉴얼 의 문서에 따라 하위 디렉토리 스펙의 일부가 누락되었습니다.

샘플 .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

내 버전에 일부 parens가 누락되었다고 생각합니다. 추가했습니다. (샘플과 비교해 보았고 하위 디렉토리 사양과 관련하여 추가 버전이 있었을 것입니다.("dev/test" . ((spec1 ...) (spec2 ...) ...))
Jonathan Leech-Pepin

그렇습니다. 유일한 문제는 모드 변수가 디렉토리 변수보다 우선한다는 점이지만, c 모드에만 관련되어 있기 때문에 init 동안 setq-default로 설정할 수 있습니다. 대단히 감사합니다.
nert

1
이상하다. 오늘 사용하여 테스트를 수행 ((org-mode . ((org-indent-mode . t))) ("subdir" . ((nil . ((org-indent-mode . nil))))하고 제대로 작동했습니다 (로컬 var를 nil로 설정하라는 프롬프트가 표시됨). 어쩌면 루트 디렉토리를 하위 디렉토리 스펙보다 위에 놓아보십시오. 마지막으로 찾은 값으로 설정할 수 있습니다.
Jonathan Leech-Pepin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.