No tengo muy claras todas las variaciones de las variables locales de búfer, incluso después de leer todo el documento y un montón de publicaciones aquí en SX.
Aquí hay un resumen de mis entendimientos:
(defvar foo ..)
declara una variable dinámica para el archivo. Pero la variable es (1) desconocida para otros archivos a menos que también incluyan una defvar
declaración, y (2) la variable tiene un alcance global, no un búfer local.
(make-variable-buffer-local foo)
después de lo defvar
anterior le dice al compilador y a todos los demás que la variable foo debe ser tratada como buffer-local en todos los lugares donde se establece, cuando se establece. Por lo tanto, este patrón es un buen estilo para declarar una variable local de búfer, colocando ambas declaraciones consecutivas en el archivo.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Por conveniencia, el (defvar-local xxx ...)
formulario se puede usar como una línea, en lugar de las dos líneas anteriores:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Una vez declarada como arriba, la variable xxx se puede usar como cualquier otra variable en las instrucciones setq.
Si solo quiero tener una sola instancia de una variable local de búfer que ya sea una variable dinámica global, usaría las siguientes declaraciones. La primera declara la variable dinámica de alcance global, y la segunda declaración hace solo una instancia de una versión local de búfer de esa variable, en el búfer actual:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Ahora para mis preguntas explícitas (todo lo anterior fueron preguntas implícitas sobre si mi comprensión es correcta).
Al establecer el valor de las variables, puedo usar setq
o
setq-local
. ¿Cuándo se debe setq-local
usar? ¿Por qué?
¿Qué sucede si lo uso setq-local
en vars locales de búfer o vars no locales de búfer?
¿Se setq-local
requiere para una defvar-local
variable declarada?
¿ setq-local
En una defvar
variable declarada normal la convertirá en una variable local de búfer? (En otras palabras, ¿es de setq-local
alguna manera el equivalente de una (make-variable-local xxx)
declaración?
(setq-local VAR VALUE)
es solo una abreviatura de (set (make-local-variable VAR) VALUE)
, que era (y sigue siendo) un idioma común.