Recarga de variables locales de directorio

27

¿Cómo se recargan las variables locales de directorio? Me gustaría modificar .dir-locals.elay aplicar esos cambios a la sesión actual de Emacs.

Elena
fuente
3
Las variables locales de directorio no se aplican a la sesión; se aplican a cada búfer relacionado con un archivo en ese directorio. Por lo tanto, un enfoque, si está bien en revertir sus memorias intermedias abiertas, sería simplemente revertirlas todas, ejecutándolas buffer-list.
Pradhan
@Pradhan: Aunque prefiero emplear un enfoque más directo, su sugerencia funcionó. Gracias.
Elena
3
@Pradhan Me equivoqué: revertir el búfer no funciona, a menos que las variables locales se hayan registrado como seguras.
Elena

Respuestas:

21

Esta función volverá a leer el archivo dir-locals y establecerá los nuevos valores para el búfer actual:

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

Y si desea recargar dir-locales para cada búfer en el directorio de su búfer actual:

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

Puede hacer que todos los locales dir se actualicen cada vez que guarde un archivo dir-locales agregando un after-save-hookbúfer a .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))))

Por supuesto, esto podría tener consecuencias no deseadas porque restablecerá los valores de las variables independientemente de si se han cambiado en otro lugar, así que úselo bajo su propio riesgo.

Jordon Biondo
fuente
55
Yo casi siento como este debe ser incorporado en Emacs.
PythonNut
3

También puedes usar: M-: (hack-dir-local-variables-non-file-buffer)


Para verificar que funciona : desde un búfer (un archivo de modo de organización por ejemplo), escriba M-x add-dir-local-variable, luego valide (modo de organización predeterminado), luego escriba demo RET, luego "esto es una demo" RET.

Su archivo .dir-locals.el aparecerá en un búfer:

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

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

Tienes que guardarlo: C-x C-s

Luego, regrese al búfer de modo de organización y verifique que la variable de demostración no esté definida ( C-h C-v demo)

Aquí puedes usar el truco: M-: (hack-dir-local-variables-non-file-buffer)

Ahora C-h C-v demoimprimirá:

el valor de la demostración es "esto es una demostración" Local en el búfer poub.org; globalmente nulo

El valor de esta variable es directorio-local, establecido por el archivo
'/home/picaud/Temp/.dir-locals.el'.

Documentación: No documentado como una variable.

Picaud Vincent
fuente