重新加载目录局部变量


27

如何重新加载目录局部变量?我想修改一个.dir-locals.el并将这样的更改应用于当前的Emacs会话。


3
目录本地变量不适用于会话-它们适用于与该目录中文件相关的每个缓冲区。因此,一种方法,如果可以恢复打开的缓冲区,可以通过运行来简单地恢复所有缓冲区buffer-list
Pradhan 2015年

@Pradhan:尽管我宁愿采用更直接的方法,但您的建议还是可行的。谢谢。
Elena 2015年

3
@Pradhan我错了:除非已将本地变量注册为安全的,否则还原缓冲区不起作用。
Elena 2015年

Answers:


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文件时刷新所有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
几乎觉得这应该内置到Emacs中。
PythonNut

3

您还可以使用: M-: (hack-dir-local-variables-non-file-buffer)


要检查它是否有效:从缓冲区(例如组织模式文件)中,键入M-x add-dir-local-variable,然后进行验证(默认组织模式),然后键入demo RET,然后键入“ this is demo” 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将打印:

demo的值是缓冲区poub.org中的“ this is a demo” Local;全球无效

此变量的值是本地目录,由文件
“ /home/picaud/Temp/.dir-locals.el”设置。

文档:未记录为变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.