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
?
elisp
local-variables
buffer-local
Maciej Goszczycki
źródło
źródło
make-variable-buffer-local
niemake-local-variable
.Odpowiedzi:
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życiaunintern
na symbolu. (makunbound
nie 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,
unintern
a następnie ponowne przypisanie zmiennej dowolnej wartości - będzie to wartość globalna.źródło