Spraw, aby zmienna lokalna bufora ponownie stała się globalna

12

Eksperymentowałem ze zmiennymi lokalnymi i ustawiłem:

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

Później przeprojektowałem swój program, aby zamiast niego używał zmiennej globalnej, używając:

(defvar foo nil "Not buffer local foo")

ale zmienna jest nadal buforowana lokalnie, a nawet jej (kill-local-variable 'foo)nie zabiła.

Zasadniczo, jak mogę „cofnąć” make-local-variable?

Maciej Goszczycki
źródło
1
Tylko FWI, defvar-lokalne zastosowania make-variable-buffer-localnie make-local-variable.
Malabarba,

Odpowiedzi:

12

Komentarz @Malabarba wyjaśnia twój problem.

kill-local-variable nie pozbyć się zmiennej lokalnej wiążącego. Ale ponieważ w twoim przypadku zmienna jest automatycznie lokalna w dowolnym buforze, po ponownym przypisaniu jej wartości, ta wartość jest lokalna.

AFAIK, nie ma sposobu na przeciwstawienie się make-variable-buffer-local, oprócz użycia uninternna symbolu. ( makunboundnie pomaga.)

Jeśli używasz unintern, wszystko jest w porządku. Należy jednak pamiętać, że odinterling całkowicie usuwa symbol, więc jeśli użyjesz go do czegoś innego, oprócz zmiennej, mogą wystąpić negatywne konsekwencje.

Więc jedyną odpowiedzią, jaką mam, jest użycie, uninterna następnie ponowne przypisanie zmiennej dowolnej wartości - będzie to wartość globalna.

Rysował
źródło