Rechargement des variables locales du répertoire

27

Comment rechargez-vous les variables locales du répertoire? Je voudrais modifier un .dir-locals.elet appliquer ces changements à la session Emacs en cours.

Elena
la source
3
Les variables locales du répertoire ne s'appliquent pas à la session - elles s'appliquent à chaque tampon lié à un fichier dans ce répertoire. Donc, une approche, si vous êtes d'accord avec la restauration de vos tampons ouverts, serait de simplement les restaurer tous en les exécutant buffer-list.
Pradhan
@Pradhan: Bien que je préfère utiliser une approche plus directe, votre suggestion a fonctionné. Merci.
Elena
3
@Pradhan J'avais tort: ​​la restauration du tampon ne fonctionne pas, sauf si les variables locales ont été enregistrées comme sûres.
Elena

Réponses:

21

Cette fonction relira le fichier dir-locals et définira les nouvelles valeurs pour le tampon actuel:

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

Et si vous souhaitez recharger dir-local pour chaque tampon dans le répertoire de votre tampon actuel:

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

Vous pouvez faire actualiser tous les dir locaux chaque fois que vous enregistrez un fichier dir locaux en ajoutant un after-save-hooktampon à .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))))

Bien sûr, cela pourrait avoir des conséquences inattendues car cela réinitialisera les valeurs des variables, qu'elles aient ou non été modifiées ailleurs, utilisez-les donc à vos propres risques.

Jordon Biondo
la source
5
J'ai presque l' impression que cela devrait être intégré à Emacs.
PythonNut
3

Vous pouvez aussi utiliser: M-: (hack-dir-local-variables-non-file-buffer)


Pour vérifier que cela fonctionne : à partir d'un tampon (un fichier en mode org par exemple), tapez M-x add-dir-local-variable, puis validez (mode org par défaut), puis tapez demo RET, puis "this is a demo" RET.

Votre fichier .dir-locals.el apparaîtra dans un tampon:

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

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

Vous devez l'enregistrer: C-x C-s

Revenez ensuite à votre tampon de mode org et vérifiez que la variable de démonstration n'est pas définie ( C-h C-v demo)

Ici, vous pouvez utiliser l'astuce: M-: (hack-dir-local-variables-non-file-buffer)

Imprime maintenant C-h C-v demo:

la valeur de la démo est "ceci est une démo" Local dans le tampon poub.org; globalement nul

La valeur de cette variable est locale au répertoire, définie par le fichier
'/home/picaud/Temp/.dir-locals.el'.

Documentation: non documentée en tant que variable.

Picaud Vincent
la source