Ich bin mir nicht ganz sicher, welche Variationen von pufferlokalen Variablen es gibt, selbst nachdem ich alle Dokumente und eine Reihe von Beiträgen hier auf SX gelesen habe.
Hier ist eine Zusammenfassung meines Verständnisses:
(defvar foo ..)
deklariert eine dynamische Variable für die Datei. Die Variable ist jedoch (1) anderen Dateien nur bekannt, wenn sie auch eine defvar
Anweisung enthält, und (2) der Gültigkeitsbereich der Variablen ist global und nicht lokal gepuffert.
(make-variable-buffer-local foo)
nachdem das defvar
oben Gesagte dem Compiler und allen anderen mitgeteilt hat, dass die Variable foo überall dort als pufferlokal zu behandeln ist, wo sie gesetzt ist, wenn sie gesetzt ist. Dieses Muster eignet sich also gut zum Deklarieren einer pufferlokalen Variablen, bei der beide Anweisungen in der Datei hintereinander abgelegt werden.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Der Einfachheit halber kann das (defvar-local xxx ...)
Formular anstelle der beiden obigen Zeilen als eine Zeile verwendet werden:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Einmal wie oben deklariert, kann die Variable xxx wie jede andere Variable in setq-Anweisungen verwendet werden.
Wenn ich nur eine einzelne Instanz einer pufferlokalen Variablen haben möchte, die bereits eine globale dynamische Variable ist, würde ich die folgenden Deklarationen verwenden. Die erste deklariert die dynamische Variable mit globalem Gültigkeitsbereich und die zweite Anweisung erstellt nur eine Instanz einer pufferlokalen Version dieser Variablen im aktuellen Puffer:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Nun zu meinen expliziten Fragen (alle oben genannten waren implizite Fragen, ob mein Verständnis korrekt ist).
Wenn ich den Wert von Variablen einstelle, kann ich setq
oder verwenden
setq-local
. Wann sollte setq-local
verwendet werden? Warum?
Was passiert, wenn ich setq-local
pufferlokale oder nicht pufferlokale Variablen verwende?
Wird setq-local
für eine defvar-local
deklarierte Variable benötigt?
Verwandelt sich setq-local
eine normal defvar
deklarierte Variable in eine pufferlokale Variable? (Mit anderen Worten, ist das setq-local
irgendwie das Äquivalent einer (make-variable-local xxx)
Erklärung?
(setq-local VAR VALUE)
ist nur eine Abkürzung für (set (make-local-variable VAR) VALUE)
, was eine verbreitete Redewendung war (und immer noch ist).