디렉토리 로컬 변수 재로드


27

디렉토리 로컬 변수를 어떻게 다시로드합니까? 를 수정 .dir-locals.el하고 현재 Emacs 세션에 이러한 변경 사항을 적용하고 싶습니다 .


3
디렉토리 로컬 변수는 세션에 적용되지 않으며 해당 디렉토리의 파일과 관련된 모든 버퍼에 적용됩니다. 따라서 열린 버퍼를 되 돌리는 것이 좋은 방법 중 하나는를 통해 실행하여 간단히 모든 버퍼를 되 돌리는 것 buffer-list입니다.
Pradhan

@Pradhan : 좀 더 직접적인 접근 방식을 사용하지만 제안이 효과가 있습니다. 감사.
Elena

3
@Pradhan이 잘못되었습니다 : 로컬 변수가 안전한 것으로 등록되어 있지 않으면 버퍼를 되돌릴 수 없습니다.
Elena

답변:


21

이 함수는 dir-locals 파일을 다시 읽고 현재 버퍼의 새로운 값을 설정합니다 :

(defun my-reload-dir-locals-for-current-buffer ()
  "reload dir locals for the current buffer"
  (interactive)
  (let ((enable-local-variables :all))
    (hack-dir-local-variables-non-file-buffer)))

현재 버퍼 디렉토리의 모든 버퍼에 대해 dir-locals를 다시로드하려면 다음을 수행하십시오.

(defun my-reload-dir-locals-for-all-buffer-in-this-directory ()
  "For every buffer with the same `default-directory` as the 
current buffer's, reload dir-locals."
  (interactive)
  (let ((dir default-directory))
    (dolist (buffer (buffer-list))
      (with-current-buffer buffer
        (when (equal default-directory dir))
        (my-reload-dir-locals-for-current-buffer)))))

after-save-hook.dir-locals.el 버퍼를 추가하여 dir-locals 파일을 저장할 때마다 모든 dir locals를 새로 고칠 수 있습니다 .

(add-hook 'emacs-lisp-mode-hook
          (defun enable-autoreload-for-dir-locals ()
            (when (and (buffer-file-name)
                       (equal dir-locals-file
                              (file-name-nondirectory (buffer-file-name))))
              (add-hook (make-variable-buffer-local 'after-save-hook)
                        'my-reload-dir-locals-for-all-buffer-in-this-directory))))

물론 변수 값이 다른 곳에서 변경되었는지 여부에 관계없이 변수 값을 재설정하므로 의도하지 않은 결과가 발생할 수 있으므로 자신의 책임하에 사용하십시오.


5
나는 거의 이 이맥스에 내장해야 같은 느낌.
PythonNut

3

다음을 사용할 수도 있습니다. M-: (hack-dir-local-variables-non-file-buffer)


작동하는지 확인하려면 버퍼 (예 : 조직 모드 파일)에서을 입력 M-x add-dir-local-variable한 다음 유효성 검사 (기본 조직 모드)를 입력 한 다음 demo RET을 입력 한 다음 "이것은 데모입니다"RET입니다.

귀하의 .DIR-locals.el의 파일은 버퍼에 나타납니다 :

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((org-mode
  (demo . "this is a demo")))

당신은 그것을 저장해야합니다 : C-x C-s

그런 다음 조직 모드 버퍼로 돌아가 데모 변수가 정의되어 있지 않은지 확인하십시오 ( C-h C-v demo).

트릭을 사용할 수 있습니다. M-: (hack-dir-local-variables-non-file-buffer)

이제 C-h C-v demo인쇄합니다 :

데모의 값은 "이것은 데모입니다"버퍼 poub.org의 로컬입니다. 전 세계적으로 무효

이 변수의 값은
'/home/picaud/Temp/.dir-locals.el' 파일에 의해 설정된 디렉토리 로컬 입니다.

설명서 : 변수로 문서화되지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.