Digamos que defino una variable local de búfer foo, y su valor predeterminado es "a":
(defvar foo "a")
(make-variable-buffer-local 'foo)
(default-value 'foo) ;; => "a"
Inmediatamente después de esto ejecuto el siguiente código:
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "b"
El resultado es "b", que es el valor que establecí let.
Ahora, si uso setqpara configurar la variable, vuelva a ejecutar exactamente el mismo código que antes:
(setq foo "c") ;; => "c"
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "a"
El resultado es "a", que es el valor predeterminado ahora.
La pregunta : por un buffer temporal, el valor por defecto de foono se establece hasta que utilizo setq? ¿Y mientras no lo use setq, puedo usarlo letpara cambiar el valor predeterminado en otros búferes?
EDITAR : como dijo @npostavs, esto es lo que make-varible-buffer-localrealmente significa. Si me uso make-variable-buffer-local, siempre puedo usar setqdespués de eso. Pero esto se vuelve realmente complicado para las variables locales de búfer "incorporadas" como case-fold-search. si yo, como autor del paquete, se unen case-fold-searcha nilen el exterior let, y quiero usar el valor por defecto (que puede o no puede ser establecido por el usuario) en el with-temp-buffer, tengo que usar setqantes with-temp-bufferpara asegurarse de que el valor por defecto es en realidad siendo utilizado en caso de que el usuario no tenga eso setqen su / ella init.el. Para las variables locales de búfer, probablemente significa setqque siempre es más seguro que letcuando queremos establecer el valor. Me pregunto si el diseño o la documentación podrían mejorarse.
with-temp-buffer(dicho esto, sin macros). Creo que es más como un comportamiento específico para las variables locales de búfer.
with-temp-buffer(en lugar de antes), ¿eso ayuda?with-temp-bufferes una macro y se comporta de manera un poco diferente a una función estándar. Por ejemplo,(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))