Tworzę bibliotekę i chciałbym ją ponownie załadować po edycji bez wychodzenia z Emacsa (zakładam, że jest włączona load-path
):
(load-library "myname")
Kiedy to robię, Emacs nie odbiera zmian w defvar
zmiennych związanych z.
Nie chcę ręcznie wywoływać eval-defun
( C-M-x) w każdym formularzu najwyższego poziomu. Czy M-x eval-buffer
szacunek defvar
/ defcustom
?
(unload-feature 'myname)
pierwszy?eval-defun
tego, nie odbiera zmian wdefvar
.defvar
plików w buforze, jeśli dobrze rozumiem.load-file
oznacza, że chce ocenić cały plik, upewniając się, że defvary są ponownie ocenione.Odpowiedzi:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
To będzie działać tak długo, jak pierwszy załadowane defvars poprzez załadowanie biblioteki przez emacs, a nie za pomocą
eval-defun
,eval-buffer
itd.Podczas korzystania
require
,load-library
itp Emacs śledzić zmienne i funkcje, które są częścią biblioteki i będzie je usunąć całkowicie dla Ciebie podczas korzystaniaunload-feature
.Pisząc pakiety, uważam, że użycie powyższego kodu jest lepszym rozwiązaniem niż uruchamianie,
eval-defun
gdy piszesz nowy kod, aby nie dostać się do stanów pośrednich.źródło
(info "(elisp) Loading")
,(info "(elisp) Unloading")
Iunload-feature
wymagająforce
arg jeśli biblioteka jest zależność dla innej biblioteki. Świetna odpowiedź! Zastanawiam się, która wersja Emacsa zaczyna zapewniać rozładunek ...defvar
nie przypisuje ponownie wartości zmiennej w taki sam sposób jak powiedzsetq
lubsetf
. Gdy zmienna ma wartość,defvar
nie będzie jej dotykać.Z dokumentu
defvar
:Ponieważ przypuszczalnie
defvar
edytowałeś dane zmienne, aby nadać im wartości podczas pierwszego ładowania biblioteki, ponowne załadowanie biblioteki nie zmieni wartości.Zobacz także ręczny węzeł elisp na temat Definiowania zmiennych globalnych .
Zamiast polegać
defvar
, zawsze możesz ponownie przypisać wartości za pomocąsetq
. Alternatywną, niezgrabną opcją sąunintern
symbole, dzięki którymdefvar
s nie znajdą ich po przeładowaniu:źródło
defvar
należy używać właściwego rozwiązania.setq
spowoduje zablokowanie dostosowań ustawionych przez poszczególnych użytkowników. OP prosi o sposób wymuszenia zastąpieniadefvar
zmiennych podczas tworzenia pakietu . Zmiana nasetq
wymagałaby przełączenia z powrotem dodefvar
momentu wydania pakietu.defvar
jest to odpowiednie do rozwoju pakietu. Podkreślam tylko, żedefvar
nie przypisuje się wartości, asetq
robi to.Spróbuj tego:
To po prostu używa tego samego kodu, który
eval-defun
używa nadefvar
. Przechodzi przez bufor (lub jego ograniczenia przez zawężenie), zatrzymując się na każdym z nichdefvar
i używając na nimeval-defun
kodu.źródło
Po usłyszeniu, że nie ma wygodnego rozwiązania do ponownej oceny bufora z ponownym przypisaniem
defvar
, utworzyłem prostą funkcję, która przekazujeeval-defun
:Struktura kodu inspirowana
eval-defun-2
implementacją. Jest podobny do Jak wymusić ponowną ocenę defvar? rozwiązanie.Początkowo chcę, aby funkcja wysokiego poziomu ponownie oceniła bibliotekę, która została ponownie zainstalowana za pomocą skryptu kompilacji, tak aby:
Rozwiązanie Drew działa nawet na zagnieżdżonych,
defvar
ale trudno jest w pełni zrozumieć kod.Myślę też o
unintern
wszystkich symbolach opartych na prefiksie / regexie symbolu (jak zasugerował Dan ), ale jestem leniwy, aby za każdym razem wpisywać prefiks ... Zobacz Jak mogę rozwiązać wszystkie definicje symboli za pomocą określonego prefiksu?źródło