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 defvar
atas 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 setq
atau
setq-local
. Kapan sebaiknya setq-local
digunakan? Mengapa?
Apa yang terjadi jika saya menggunakan setq-local
vars buffer-lokal, atau vars non-buffer-lokal?
Apakah setq-local
diperlukan untuk defvar-local
variabel yang dideklarasikan?
Akankah setq-local
pada defvar
variabel yang dinyatakan normal mengubahnya menjadi variabel buffer-lokal? (Dengan kata lain, apakah setq-local
itu 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.