Ich entwickle eine Bibliothek und möchte sie nach der Bearbeitung neu laden, ohne Emacs zu beenden (vorausgesetzt, sie ist aktiviert load-path
):
(load-library "myname")
Wenn ich das mache, nimmt Emacs keine Änderungen an defvar
gebundenen Variablen auf.
Ich möchte eval-defun
( C-M-x) nicht manuell in jedem Formular der obersten Ebene aufrufen . Ist M-x eval-buffer
Respekt defvar
/ defcustom
?
(unload-feature 'myname)
zuerst?eval-defun
es keine Änderungen aufdefvar
.defvar
s in einer Datei oder einem Puffer zu reagieren, wenn ich das richtig verstehe.load-file
impliziert, dass er die gesamte Datei auswerten und gleichzeitig sicherstellen möchte, dass die Defvars neu bewertet werden.Antworten:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Dies wird so lange arbeiten , wie Sie zuerst die defvars geladen , indem die Bibliothek durch Emacs geladen, und nicht mit
eval-defun
,eval-buffer
usw.Wenn Sie usw. verwenden
require
, verfolgtload-library
Emacs, welche Variablen und Funktionen Teil Ihrer Bibliothek sind, und entfernt sie bei Verwendung vollständig für Sieunload-feature
.Beim Schreiben von Paketen finde ich, dass die Verwendung des obigen Codes eine bessere Lösung ist als das Ausführen,
eval-defun
wenn Sie neuen Code schreiben, damit Sie nicht in Zwischenzustände geraten.quelle
(info "(elisp) Loading")
,(info "(elisp) Unloading")
Undunload-feature
erfordernforce
arg , wenn Bibliothek Abhängigkeit für eine andere Bibliothek ist. Gute Antwort! Ich frage mich, welche Emacs-Version das Entladen ermöglicht ...defvar
weist den Wert einer Variablen nicht auf die gleiche Weise zu, wie z. B.setq
odersetf
. Sobald eine Variable einen Wert hat,defvar
wird sie nicht mehr berührt.Aus
defvar
dem Dokument:Da Sie
defvar
die fraglichen Variablen vermutlich so bearbeitet haben, dass sie beim ersten Laden der Bibliothek Werte erhalten, werden die Werte beim erneuten Laden der Bibliothek nicht geändert.Siehe auch den elisp-Handbuchknoten zum Definieren globaler Variablen .
Anstatt sich darauf zu verlassen
defvar
, können Sie mit immer Werte neu zuweisensetq
. Als alternative, klobige Option können Sieunintern
die Symbole so verwenden, dass diedefvar
s sie beim erneuten Laden nicht finden:quelle
defvar
ist die richtige Verwendung.setq
würde Anpassungen anpassen, die von einzelnen Benutzern festgelegt wurden. OP fragt nach einer Möglichkeit, das Überschreiben vondefvar
Variablen während der Paketentwicklung zu erzwingen . Das Umschalten aufsetq
würde das Zurückschalten auf erfordern,defvar
wenn das Paket freigegeben wird.defvar
für die Paketentwicklung geeignet ist. Ich weise nur darauf hin, dassdefvar
Werte nicht neu zugewiesen werden, während dies dersetq
Fall ist.Versuche dies:
Das verwendet nur den gleichen Code,
eval-defun
der auf einem verwendet wirddefvar
. Es durchläuft den Puffer (oder seine Einschränkung durch Verengung), stoppt bei jedemdefvar
und verwendet den darauf enthalteneneval-defun
Code.quelle
Nachdem ich gehört habe, dass es keine bequeme Lösung für die Neubewertung des Puffers mit Neuzuweisung von gibt
defvar
, habe ich eine einfache Funktion erstellt, die Folgendes ermöglichteval-defun
:Von der
eval-defun-2
Implementierung inspirierte Codestruktur. Es ist ähnlich wie Wie erzwinge ich eine Neubewertung einer Defvar? Lösung.Ursprünglich möchte ich, dass die High-Level-Funktion die Bibliothek neu bewertet, die über das Build-Skript neu installiert wurde.
Die Drew- Lösung funktioniert auch bei verschachtelten Lösungen,
defvar
aber es ist schwierig, den Code vollständig zu verstehen.Ich denke auch an
unintern
alle Symbole, die auf Symbolpräfix / Regex basieren (wie Dan vorgeschlagen hat), aber ich bin faul, jedes Mal ein Präfix einzugeben ... Siehe Wie kann ich alle Symboldefinitionen mit einem bestimmten Präfix aufheben?quelle