Je ne suis pas tout à fait clair sur toutes les variations des variables locales du tampon, même après avoir lu tous les documents et un tas de publications ici sur SX.
Voici un résumé de mes compréhensions:
(defvar foo ..)
déclare une variable dynamique pour le fichier. Mais la variable n'est (1) pas connue des autres fichiers à moins qu'ils n'incluent également une defvar
instruction, et (2) la variable a une portée globale, pas un tampon local.
(make-variable-buffer-local foo)
après ce qui defvar
précède, il indique au compilateur et à tous les autres que la variable foo doit être traitée comme tampon local partout où elle est définie, lorsqu'elle est définie. Ce modèle est donc un bon style pour déclarer une variable locale de tampon, en mettant les deux instructions dos à dos dans le fichier.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Pour plus de commodité, le (defvar-local xxx ...)
formulaire peut être utilisé sur une seule ligne, à la place des deux lignes ci-dessus:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Une fois déclarée comme ci-dessus, la variable xxx peut être utilisée comme n'importe quelle autre variable dans les instructions setq.
Si je veux juste avoir une seule instance d'une variable tampon locale qui est déjà une variable dynamique globale, j'utiliserais les déclarations suivantes. La première déclare la variable dynamique de portée globale, et la deuxième instruction crée une seule instance d'une version tampon locale de cette variable, dans le tampon actuel:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Maintenant pour mes questions explicites (toutes les questions ci-dessus étaient des questions implicites pour savoir si ma compréhension est correcte).
Lors de la définition de la valeur des variables, je peux utiliser setq
ou
setq-local
. Quand faut- setq-local
il l'utiliser? Pourquoi?
Que se passe-t-il si j'utilise setq-local
des vars tampons locaux ou des vars non tampons locaux?
Est setq-local
requis pour une defvar-local
variable déclarée?
Est-ce setq-local
qu'une defvar
variable déclarée normale la transformera en une variable locale tampon? (En d'autres termes, est-ce en setq-local
quelque sorte l'équivalent d'une (make-variable-local xxx)
déclaration?
(setq-local VAR VALUE)
est juste un raccourci pour (set (make-local-variable VAR) VALUE)
, qui était (et est toujours) un idiome commun.