ディレクトリローカル変数の再読み込み


27

ディレクトリローカル変数をどのようにリロードしますか?を.dir-locals.el変更して、現在のEmacsセッションにそのような変更を適用したいと思います。


3
ディレクトリローカル変数はセッションには適用されません-それらはそのディレクトリ内のファイルに関連するすべてのバッファに適用されます。そのため、オープンバッファを元に戻すことに問題がない場合、1つのアプローチは、を実行して、すべてのバッファを単に元に戻すことbuffer-listです。
プラダン

@Pradhan:より直接的なアプローチを採用したいのですが、あなたの提案はうまくいきました。ありがとう。
エレナ

3
@Pradhan私は間違っていました:ローカル変数が安全として登録されていない限り、バッファーを元に戻すことはできません。
エレナ

回答:


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
私はほとんどこれはEmacsのに組み込まれるべきであるように感じます。
PythonNut

3

以下も使用できます。 M-: (hack-dir-local-variables-non-file-buffer)


動作を確認するには、バッファ(たとえば、組織モードファイル)から、を入力M-x add-dir-local-variableしてからvalidate(デフォルトの組織モード)を入力し、demo RETと入力してから、「this is a 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印刷されます:

デモの値は「this is a demo」です。バッファpoub.orgのローカル。グローバルに無効

この変数の値はディレクトリローカルで、ファイル
「/home/picaud/Temp/.dir-locals.el」によって設定されます。

ドキュメント:変数としてドキュメント化されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.