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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.