Ponowne ładowanie zmiennych lokalnych katalogu

27

Jak przeładować zmienne lokalne katalogu? Chciałbym zmodyfikować .dir-locals.eli zastosować takie zmiany w bieżącej sesji Emacsa.

Elena
źródło
3
Zmienne lokalne dla katalogu nie dotyczą sesji - odnoszą się do każdego bufora związanego z plikiem w tym katalogu. Tak więc jednym podejściem, jeśli nie masz nic przeciwko przywracaniu otwartych buforów, byłoby po prostu przywrócić je wszystkie, uruchamiając je buffer-list.
Pradhan
@Pradhan: Chociaż wolałbym zastosować bardziej bezpośrednie podejście, twoja sugestia zadziałała. Dzięki.
Elena
3
@Pradhan Myliłem się: przywracanie bufora nie działa, chyba że zmienne lokalne zostały zarejestrowane jako bezpieczne.
Elena

Odpowiedzi:

21

Ta funkcja ponownie odczyta plik dir-locals i ustawi nowe wartości dla bieżącego bufora:

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

A jeśli chcesz ponownie załadować katalog-lokalny dla każdego bufora w bieżącym katalogu bufora:

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

Możesz mieć odświeżanie wszystkich katalogów lokalnych za każdym razem, gdy zapisujesz plik katalogów lokalnych przez dodanie after-save-hookbuforów .dir-locals.el.

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

Oczywiście może to mieć niezamierzone konsekwencje, ponieważ spowoduje to zresetowanie wartości zmiennych niezależnie od tego, czy zostały one zmienione gdzie indziej, więc używaj na własne ryzyko.

Jordon Biondo
źródło
5
I niemal poczuć jak to powinno być wbudowane w Emacsa.
PythonNut
3

Możesz także użyć: M-: (hack-dir-local-variables-non-file-buffer)


Aby sprawdzić, czy działa : z bufora (na przykład plik trybu org), wpisz M-x add-dir-local-variable, a następnie sprawdź poprawność (domyślny tryb org), następnie wpisz demo RET, a następnie „to jest demo” RET.

Twój plik .dir-locals.el pojawi się w buforze:

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

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

Musisz to zapisać: C-x C-s

Następnie wróć do bufora trybu organizacji i sprawdź, czy zmienna demonstracyjna nie jest zdefiniowana ( C-h C-v demo)

Tutaj możesz użyć lewy: M-: (hack-dir-local-variables-non-file-buffer)

Teraz C-h C-v demowydrukuje:

wartość demo to „to jest demo” Lokalny w buforze poub.org; globalnie nieważne

Ta zmienna ma wartość lokalną dla katalogu, ustawioną w pliku
„/home/picaud/Temp/.dir-locals.el”.

Dokumentacja: Nieudokumentowana jako zmienna.

Picaud Vincent
źródło