Angenommen, ich definiere eine pufferlokale Variable foound 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 setqnun 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 fooerst festgelegt, wenn ich ihn verwende setq. Und solange ich nicht verwende setq, kann ich letden Standardwert in anderen Puffern ändern?
EDIT : Wie @npostavs sagte, ist dies das, was make-varible-buffer-localwirklich bedeutet. Wenn ich make-variable-buffer-localmich 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-searchan nilin 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 , setqbevor with-temp-bufferSie sicher , dass der Standardwert tatsächlich zu machen ist Wird verwendet, falls der Benutzer dies nicht setqin sich hat init.el. Für pufferlokale Variablen bedeutet dies wahrscheinlich, dass setqes immer sicherer ist, als letwenn 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-bufferist ein Makro und verhält sich etwas anders als eine Standardfunktion. ZB(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))