Angenommen, ich definiere eine pufferlokale Variable foo
und ihr Standardwert ist "a":
(defvar foo "a")
(make-variable-buffer-local 'foo)
(default-value 'foo) ;; => "a"
Unmittelbar danach führe ich den folgenden Code aus:
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "b"
Das Ergebnis ist "b", was der Wert ist, den ich eingestellt habe let
.
Wenn ich setq
nun die Variable setze, führe genau den gleichen Code wie zuvor erneut aus:
(setq foo "c") ;; => "c"
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "a"
Das Ergebnis ist "a", was jetzt der Standardwert ist.
Die Frage : Für einen temporären Puffer wird der Standardwert von foo
erst festgelegt, wenn ich ihn verwende setq
. Und solange ich nicht verwende setq
, kann ich let
den Standardwert in anderen Puffern ändern?
EDIT : Wie @npostavs sagte, ist dies das, was make-varible-buffer-local
wirklich bedeutet. Wenn ich make-variable-buffer-local
mich selbst benutze , kann ich danach immer noch benutzen setq
. Dies wird jedoch sehr schwierig für die "eingebauten" pufferlokalen Variablen wie case-fold-search
. wenn ich als Paketautor, bindet case-fold-search
an nil
in den äußeren let
, und ich mag den Standardwert verwenden , in der (es kann oder auch nicht vom Benutzer eingestellt werden) with-temp-buffer
, muß ich verwenden , setq
bevor with-temp-buffer
Sie sicher , dass der Standardwert tatsächlich zu machen ist Wird verwendet, falls der Benutzer dies nicht setq
in sich hat init.el
. Für pufferlokale Variablen bedeutet dies wahrscheinlich, dass setq
es immer sicherer ist, als let
wenn wir den Wert festlegen möchten. Ich frage mich, ob das Design oder die Dokumentation verbessert werden könnten.
with-temp-buffer
(das heißt, keine Makros). Ich denke, es ist eher ein spezifisches Verhalten für pufferlokale Variablen.
with-temp-buffer
(anstatt davor) legen , hilft das irgendetwas?with-temp-buffer
ist ein Makro und verhält sich etwas anders als eine Standardfunktion. ZB(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))