Recarregando Variáveis ​​Local do Diretório

27

Como você recarrega as variáveis ​​locais do diretório? Gostaria de modificar um .dir-locals.ele aplicar essas alterações à sessão atual do Emacs.

Elena
fonte
3
As variáveis ​​de diretório local não se aplicam à sessão - elas se aplicam a todos os buffers relacionados a um arquivo nesse diretório. Portanto, uma abordagem, se você estiver bem em reverter seus buffers abertos, seria simplesmente reverter todos eles, executando o processo buffer-list.
Pradhan
@ Pradhan: Embora eu prefira empregar uma abordagem mais direta, sua sugestão funcionou. Obrigado.
Elena
3
@ Pradhan Eu estava errado: reverter o buffer não funciona, a menos que as variáveis ​​locais tenham sido registradas como seguras.
Elena

Respostas:

21

Esta função irá reler o arquivo dir-locals e definir os novos valores para o buffer atual:

(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 você deseja recarregar dir-locals para cada buffer no diretório atual do buffer:

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

Você pode fazer com que todos os dirs locais sejam atualizados sempre que salvar um arquivo dir-locals adicionando after-save-hookaos buffers .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))))

É claro que isso pode ter conseqüências não intencionais, pois redefinirá os valores das variáveis, independentemente de terem sido alteradas em outro local, portanto, use por seu próprio risco.

Jordon Biondo
fonte
5
Eu quase sinto que isso deve ser incorporado ao Emacs.
PythonNut
3

Você também pode usar: M-: (hack-dir-local-variables-non-file-buffer)


Para verificar se funciona : em um buffer (um arquivo no modo organizacional, por exemplo), digite M-x add-dir-local-variable, valide (modo organizacional padrão), digite demo RET e depois RET "this is a demo".

Seu arquivo .dir-locals.el aparecerá em um buffer:

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

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

Você precisa salvá-lo: C-x C-s

Em seguida, volte para o buffer do modo organizacional e verifique se a variável demo não está definida ( C-h C-v demo)

Aqui você pode usar o truque: M-: (hack-dir-local-variables-non-file-buffer)

Agora C-h C-v demoserá impresso:

O valor da demo é "esta é uma demo" Local em buffer poub.org; globalmente nulo

O valor dessa variável é diretório-local, definido pelo arquivo
'/home/picaud/Temp/.dir-locals.el'.

Documentação: Não documentado como uma variável.

Picaud Vincent
fonte