Memuat ulang variabel direktori-lokal

27

Bagaimana Anda memuat ulang variabel direktori-lokal? Saya ingin memodifikasi .dir-locals.eldan menerapkan perubahan tersebut pada sesi Emacs saat ini.

Elena
sumber
3
Variabel direktori-lokal tidak berlaku untuk sesi - mereka berlaku untuk setiap buffer yang terkait dengan file di direktori itu. Jadi, satu pendekatan, jika Anda baik-baik saja dengan mengembalikan buffer terbuka Anda, akan dengan mudah mengembalikan semuanya, dengan menjalankannya buffer-list.
Pradhan
@Pradhan: Meskipun saya lebih suka menggunakan pendekatan yang lebih langsung, saran Anda berhasil. Terima kasih.
Elena
3
@Pradhan saya salah: mengembalikan buffer tidak berfungsi, kecuali variabel lokal telah terdaftar sebagai aman.
Elena

Jawaban:

21

Fungsi ini akan membaca kembali file dir-locals dan mengatur nilai baru untuk buffer saat ini:

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

Dan jika Anda ingin memuat ulang dir-local untuk setiap buffer di direktori buffer Anda saat ini:

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

Anda bisa membuat semua dir lokal menyegarkan setiap kali Anda menyimpan file dir-lokal dengan menambahkan after-save-hookbuffer .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))))

Tentu saja ini bisa memiliki konsekuensi yang tidak diinginkan karena akan mereset nilai variabel terlepas dari apakah mereka telah diubah di tempat lain, jadi gunakan dengan risiko Anda sendiri.

Jordon Biondo
sumber
5
Saya hampir merasa ini harus dibangun ke dalam Emacs.
PythonNut
3

Anda juga bisa menggunakan: M-: (hack-dir-local-variables-non-file-buffer)


Untuk memeriksanya berfungsi : dari buffer (misalnya file mode org), ketik M-x add-dir-local-variable, lalu validasi (mode org default), lalu ketik demo RET, lalu "ini adalah demo" RET.

Anda .dir-locals.el file yang akan muncul dalam buffer:

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

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

Anda harus menyimpannya: C-x C-s

Kemudian kembali ke buffer mode org Anda dan periksa apakah variabel demo tidak ditentukan ( C-h C-v demo)

Di sini Anda dapat menggunakan triknya: M-: (hack-dir-local-variables-non-file-buffer)

Sekarang C-h C-v demoakan dicetak:

nilai demo adalah "ini demo" Lokal di buffer poub.org; batal secara global

Nilai variabel ini adalah direktori-lokal, yang ditetapkan oleh file
'/ home / home_Temp/.dir-locals.el'.

Dokumentasi: Tidak didokumentasikan sebagai variabel.

Picaud Vincent
sumber