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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.