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 setq
para 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 foo
no se establece hasta que utilizo setq
? ¿Y mientras no lo use setq
, puedo usarlo let
para cambiar el valor predeterminado en otros búferes?
EDITAR : como dijo @npostavs, esto es lo que make-varible-buffer-local
realmente significa. Si me uso make-variable-buffer-local
, siempre puedo usar setq
despué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-search
a nil
en 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 setq
antes with-temp-buffer
para asegurarse de que el valor por defecto es en realidad siendo utilizado en caso de que el usuario no tenga eso setq
en su / ella init.el
. Para las variables locales de búfer, probablemente significa setq
que siempre es más seguro que let
cuando 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-buffer
es 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)))