Ricarica variabili directory locali


27

Come ricaricare le variabili directory locali? Vorrei modificare .dir-locals.elae applicare tali modifiche alla sessione corrente di Emacs.


3
Le variabili directory locali non si applicano alla sessione: si applicano a tutti i buffer relativi a un file in quella directory. Quindi, un approccio, se stai bene ripristinando i tuoi buffer aperti, sarebbe semplicemente ripristinarli tutti, scorrendo buffer-list.
Pradhan,

@Pradhan: anche se preferirei utilizzare un approccio più diretto, il tuo suggerimento ha funzionato. Grazie.
Elena,

3
@Pradhan Ho sbagliato: ripristinare il buffer non funziona, a meno che le variabili locali non siano state registrate come sicure.
Elena,

Risposte:


21

Questa funzione rileggerà il file dir-locals e imposterà i nuovi valori per il buffer corrente:

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

E se si desidera ricaricare i dir-local per ogni buffer nella directory del buffer corrente:

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

È possibile aggiornare tutti i locali dir ogni volta che si salva un file dir-locals aggiungendo un after-save-hookbuffer .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))))

Naturalmente questo potrebbe avere conseguenze non intenzionali perché ripristinerà i valori delle variabili indipendentemente dal fatto che siano stati modificati altrove, quindi utilizzali a tuo rischio.


5
Mi quasi sento come questo dovrebbe essere costruito in Emacs.
PythonNut,

3

Puoi anche usare: M-: (hack-dir-local-variables-non-file-buffer)


Per verificare che funzioni : da un buffer (ad esempio un file in modalità org), digita M-x add-dir-local-variable, quindi convalida (modalità org predefinita), quindi digita RET demo, quindi RET "questa è una demo".

Il tuo file .dir-locals.el apparirà in un buffer:

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

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

Devi salvarlo: C-x C-s

Quindi torna al buffer della modalità organizzazione e verifica che la variabile demo non sia definita ( C-h C-v demo)

Qui puoi usare il trucco: M-: (hack-dir-local-variables-non-file-buffer)

Ora C-h C-v demostamperà:

il valore della demo è "this is a demo" Local in buffer poub.org; nulla a livello globale

Il valore di questa variabile è directory-local, impostato dal file
'/home/picaud/Temp/.dir-locals.el'.

Documentazione: non documentata come variabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.