Dizin yerel değişkenlerini yeniden yükleme


27

Yerel dizin değişkenlerini nasıl yeniden yüklersiniz? A .dir-locals.eldeğişikliğini yapmak ve geçerli Emacs oturumuna uygulanan değişiklikleri yapmak istiyorum.


3
Yerel dizin değişkenleri oturuma uygulanmaz - bu dizindeki bir dosyayla ilgili her arabelleğe uygulanır. Bu nedenle, bir yaklaşım, eğer açık tamponlarınızı geri alma konusunda iyiyseniz, baştan sona, hepsini geri almak olacaktır buffer-list.
Pradhan

@Pradhan: Daha doğrudan bir yaklaşım tercih etsem de öneriniz işe yaradı. Teşekkürler.
Elena

3
@Pradhan Yanılmışım: yerel değişkenler güvenli olarak kaydedilmemişse, arabelleği geri almak işe yaramaz.
Elena

Yanıtlar:


21

Bu fonksiyon dir-locals dosyasını tekrar okuyacak ve mevcut tampon için yeni değerleri ayarlayacaktır:

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

Geçerli dizininizdeki her arabellek için dir-yerlileri yeniden yüklemek istiyorsanız:

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

Bir dir-locals dosyasını her kaydettiğinizde, after-save-hook.dir-locals.el tamponlarına ekleyerek tüm dir yerellerini yenileyebilirsiniz .

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

Elbette bu, istenmeyen sonuçlara yol açabilir, çünkü başka yerlerde değiştirilip değiştirilmediklerine bakılmaksızın değişken değerlerini sıfırlar, bu nedenle kendi sorumluluğunuzdadır.


5
Ben neredeyse bu Emacs yerleşik edilmelidir gibi hissediyorum.
PythonNut

3

Ayrıca kullanabilirsiniz: M-: (hack-dir-local-variables-non-file-buffer)


Nasıl çalıştığını kontrol etmek için : bir tampondan (örneğin bir org modu dosyası) yazın M-x add-dir-local-variable, sonra doğrulayın (varsayılan org modu), ardından demo RET, ardından "bu bir demo" RET.

Sizin .dir-locals.el dosyası bir tampon görünecektir:

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

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

Kaydetmelisin: C-x C-s

Ardından org modu tampon belleğine dönün ve demo değişkeninin tanımlanmadığını kontrol edin ( C-h C-v demo)

Burada hile kullanabilirsiniz: M-: (hack-dir-local-variables-non-file-buffer)

Şimdi C-h C-v demoyazdıracak:

demo'nun değeri "bu bir demo" Yerel olarak poub.org tamponunda; küresel olarak geçersiz

Bu değişkenin değeri
'/home/picaud/Temp/.dir-locals.el' dosyasıyla ayarlanan dizin-yereldir .

Belgeleme: Değişken olarak belgelenmemiş.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.