Verzeichnislokale Variablen werden neu geladen


27

Wie lade ich verzeichnislokale Variablen neu? Ich möchte eine ändern .dir-locals.elund möchte, dass solche Änderungen auf die aktuelle Emacs-Sitzung angewendet werden.


3
Die verzeichnislokalen Variablen gelten nicht für die Sitzung - sie gelten für jeden Puffer, der sich auf eine Datei in diesem Verzeichnis bezieht. Wenn Sie also Ihre offenen Puffer zurücksetzen können, besteht ein Ansatz darin, einfach alle zurückzusetzen, indem Sie sie durchlaufen buffer-list.
Pradhan

@Pradhan: Obwohl ich lieber einen direkteren Ansatz verfolgen möchte, hat Ihr Vorschlag funktioniert. Vielen Dank.
Elena

3
@Pradhan Ich habe mich geirrt: Das Zurücksetzen des Puffers funktioniert nur, wenn die lokalen Variablen als sicher registriert wurden.
Elena

Antworten:


21

Diese Funktion liest die dir-locals-Datei erneut und legt die neuen Werte für den aktuellen Puffer fest:

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

Und wenn Sie dir-locals für jeden Puffer im Verzeichnis Ihres aktuellen Puffers neu laden möchten:

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

Sie können alle after-save-hookVerzeichnis-Locals jedes Mal aktualisieren lassen, wenn Sie eine Verzeichnis-Locals -Datei speichern, indem Sie einen Puffer zu .dir-locals.el hinzufügen.

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

Dies könnte natürlich unbeabsichtigte Konsequenzen haben, da die Variablenwerte zurückgesetzt werden, unabhängig davon, ob sie an anderer Stelle geändert wurden. Verwenden Sie sie daher auf eigenes Risiko.


5
Ich habe fast das Gefühl, dass dies in Emacs eingebaut werden sollte.
PythonNut

3

Sie können auch verwenden: M-: (hack-dir-local-variables-non-file-buffer)


Um zu überprüfen, ob es funktioniert : Geben Sie in einem Puffer (z. B. eine Datei im Organisationsmodus) Folgendes ein M-x add-dir-local-variable, und validieren Sie ihn (Standard-Organisationsmodus). Geben Sie dann demo RET ein und dann "this is a demo" RET.

Ihre .dir-locals.el- Datei wird in einem Puffer angezeigt :

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

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

Sie müssen es speichern: C-x C-s

Kehren Sie dann zu Ihrem Organisationsmodus-Puffer zurück und prüfen Sie, ob die Demovariable nicht definiert ist ( C-h C-v demo)

Hier kannst du den Trick anwenden: M-: (hack-dir-local-variables-non-file-buffer)

Nun C-h C-v demowird gedruckt:

der Wert von demo ist "das ist eine Demo" Lokal in buffer poub.org; global nichtig

Der Wert dieser Variablen ist verzeichnislokal und wird in der Datei
'/home/picaud/Temp/.dir-locals.el' festgelegt.

Dokumentation: Nicht als Variable dokumentiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.