Non sono abbastanza chiaro su tutte le variazioni delle variabili buffer-local, anche dopo aver letto tutti i documenti e un sacco di post qui su SX.
Ecco un riassunto delle mie comprensioni:
(defvar foo ..)
dichiara una variabile dinamica per il file. Ma la variabile è (1) non nota ad altri file a meno che non includano anche defvar
un'istruzione e (2) la variabile abbia un ambito globale, non un buffer locale.
(make-variable-buffer-local foo)
dopo quanto defvar
sopra dice al compilatore e a tutti gli altri che la variabile foo deve essere trattata come buffer-local ovunque sia impostata, quando è impostata. Quindi questo modello è un buon stile per dichiarare una variabile buffer-local, mettendo entrambe le istruzioni back-to-back nel file.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Per comodità, il (defvar-local xxx ...)
modulo può essere utilizzato come una riga, al posto delle due righe sopra:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Una volta dichiarata come sopra, la variabile xxx può essere utilizzata come qualsiasi altra variabile nelle istruzioni setq.
Se voglio solo avere una singola istanza di una variabile buffer-local che è già una variabile dinamica globale, userò le seguenti dichiarazioni. Il primo dichiara la variabile dinamica di portata globale e la seconda istruzione crea solo un'istanza di una versione buffer-local di quella variabile, nel buffer corrente:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Ora per le mie domande esplicite (tutte le precedenti domande erano implicite sulla mia comprensione corretta).
Quando si imposta il valore delle variabili, posso usare setq
o
setq-local
. Quando dovrebbe setq-local
essere usato? Perché?
Cosa succede se utilizzo setq-local
su var-local buffer o su non-buffer local?
È setq-local
richiesto per una defvar-local
variabile dichiarata?
Sarà setq-local
su un normale defvar
variabile dichiarata trasformarlo in una variabile buffer locale? (In altre parole, è in setq-local
qualche modo l'equivalente di una (make-variable-local xxx)
dichiarazione?
(setq-local VAR VALUE)
è solo una scorciatoia per (set (make-local-variable VAR) VALUE)
, che era (ed è tuttora) un linguaggio comune.