답변:
이 함수는 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))))
물론 변수 값이 다른 곳에서 변경되었는지 여부에 관계없이 변수 값을 재설정하므로 의도하지 않은 결과가 발생할 수 있으므로 자신의 책임하에 사용하십시오.
다음을 사용할 수도 있습니다. 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' 파일에 의해 설정된 디렉토리 로컬 입니다.설명서 : 변수로 문서화되지 않았습니다.
buffer-list
입니다.