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 defvaranterior 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 setqo
setq-local. ¿Cuándo se debe setq-localusar? ¿Por qué?
¿Qué sucede si lo uso setq-localen vars locales de búfer o vars no locales de búfer?
¿Se setq-localrequiere para una defvar-localvariable declarada?
¿ setq-localEn una defvarvariable declarada normal la convertirá en una variable local de búfer? (En otras palabras, ¿es de setq-localalguna 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.