Rendre une variable de tampon local redevenue globale

12

J'expérimentais avec des variables locales et définissais:

(defvar-local foo nil "Buffer local foo")

J'ai ensuite repensé mon programme pour utiliser une variable globale à la place en utilisant:

(defvar foo nil "Not buffer local foo")

mais la variable est toujours un tampon local et (kill-local-variable 'foo)ne l'a même pas tué.

Fondamentalement, comment puis-je "annuler" make-local-variable?

Maciej Goszczycki
la source
1
Juste FWI, defvar-local n'utilise make-variable-buffer-localpas make-local-variable.
Malabarba

Réponses:

12

Le commentaire de @Malabarba explique votre problème.

kill-local-variable ne se débarrasse pas de la liaison de variable locale. Mais puisque dans votre cas, la variable est automatiquement locale dans n'importe quel tampon, lorsque vous lui réaffectez une valeur, cette valeur est locale.

AFAIK, il n'y a aucun moyen de contrer make-variable-buffer-local, sauf pour utiliser uninternsur le symbole. ( makunboundn'aide pas.)

Si vous utilisez unintern alors vous êtes OK. Mais gardez à l'esprit que l'internalisation supprime complètement le symbole, donc si vous avez utilisé le symbole pour autre chose, en plus d'une variable, il pourrait y avoir des conséquences négatives.

Donc, la seule réponse que j'ai est d'utiliser uninternpuis de réaffecter la variable quelle que soit la valeur que vous souhaitez - ce sera une valeur globale.

A dessiné
la source