Saya tidak begitu jelas tentang semua variasi variabel buffer-lokal, bahkan setelah membaca semua dokumen dan banyak posting di SX.
Berikut ringkasan pemahaman saya:
(defvar foo ..)mendeklarasikan variabel dinamis untuk file. Tetapi variabelnya adalah (1) tidak dikenal ke file lain kecuali mereka menyertakan defvar
pernyataan juga, dan (2) variabelnya adalah global dalam cakupan, bukan buffer lokal.
(make-variable-buffer-local foo)setelah di defvaratas memberitahu kompiler dan semua orang bahwa variabel foo harus diperlakukan sebagai penyangga-lokal di mana pun diset, ketika diatur. Jadi pola ini adalah gaya yang baik untuk mendeklarasikan variabel buffer-local, meletakkan kedua pernyataan tersebut secara berurutan di dalam file.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Untuk kenyamanan, (defvar-local xxx ...)formulir dapat digunakan sebagai satu baris, sebagai ganti dari dua baris di atas:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Setelah dinyatakan seperti di atas, variabel xxx dapat digunakan seperti variabel lain dalam pernyataan setq.
Jika saya hanya ingin memiliki satu instance dari variabel buffer-lokal yang sudah menjadi variabel dinamis global, saya akan menggunakan deklarasi berikut. Yang pertama mendeklarasikan variabel dinamis lingkup global, dan pernyataan kedua hanya membuat satu instance dari versi buffer-lokal dari variabel itu, dalam buffer saat ini:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Sekarang untuk pertanyaan explict saya (semua pertanyaan di atas adalah pertanyaan implisit tentang apakah pemahaman saya benar).
Saat mengatur nilai variabel, saya bisa menggunakan setqatau
setq-local. Kapan sebaiknya setq-localdigunakan? Mengapa?
Apa yang terjadi jika saya menggunakan setq-localvars buffer-lokal, atau vars non-buffer-lokal?
Apakah setq-localdiperlukan untuk defvar-localvariabel yang dideklarasikan?
Akankah setq-localpada defvarvariabel yang dinyatakan normal mengubahnya menjadi variabel buffer-lokal? (Dengan kata lain, apakah setq-localitu setara dengan (make-variable-local xxx)deklarasi?
(setq-local VAR VALUE)hanya singkatan untuk (set (make-local-variable VAR) VALUE), yang (dan masih) idiom umum.