Meine Konfiguration ist voller Ratschläge, und ich höre immer wieder von dem neuen, glänzenden, minimalistischen nadvice.el
Paket.
Ich habe die Handbücher durchsucht und die Quelle gelesen , aber ich gebe offen zu: Ich habe immer noch keine Ahnung, wie ich sie tatsächlich verwenden soll.
Kann mich hier jemand auf einen Leitfaden hinweisen oder mir sagen, wie ich anfangen kann, meine Ratschläge nach alter Art zu portieren?
advice
emacs-internals
elisp
PythonNut
quelle
quelle
M-x report-emacs-bug
. Einige Entwickler bevorzugen manchmal die Entwicklung gegenüber der Dokumentation. ;-) Es ist wichtig, dass sich Emacs selbst dokumentiert.nadvice
von meinem config: : nach , : Filter-Rückkehr , : um , : vor-bisAntworten:
Alle Informationen, die Sie benötigen, sind enthalten und
C-h f add-function
beschreiben den zugrunde liegenden Mechanismus vonadvice-add
.Das neue Hinweissystem ersetzt im Grunde genommen die aktuelle Definition einer Funktion durch die in der Tabelle beschriebene Funktion.
C-h f add-function
Abhängig von Ihrer Wahl desWHERE
Arguments wird nur die Funktion übersichtlicher, um nachzuverfolgen, welches Verhalten in welcher Quelldatei definiert wurde.Ein Beispiel mit der
:around
OptionDer allgemeinste Fall ist die
:around
Option, also gebe ich ein Beispiel dafür. (Es ist wahrscheinlich besser,WHERE
wenn möglich dedizierte Parameter zu verwenden, aber Sie können jede andere durch eine entsprechende:around
Funktion ersetzen .)Nehmen wir als Beispiel an, Sie möchten bei jedem Aufruf die Verwendung von debuggen
find-file
und dieprint
Argumentliste ändern. Du könntest schreibenMit dieser neuen Implementierung wird alles, was der Rat benötigt, als Argument übergeben.
ad-get-args
wird unnötig, da die Argumente als normale Funktionsargumente (fürWHERE
Argumente, für die es Sinn macht) an die Hinweisfunktion übergeben werden.ad-do-it
wird unnötig, da:around
Beratung als Argumente die Funktion und die Argumente erhält, also(ad-do-it)
durch die Form ersetzt wirdoder wenn Sie die Argumente benannt haben
Das ist sauberer, da keine magischen Formen beteiligt sind. Das Ändern der Argumente erfolgt einfach durch Übergeben geänderter Werte an
OLD-FUNCTION
.Andere
WHERE
WerteDer docstring von
add-function
enthält eine Tabelle aller Beratungsstellen (oder "Kombinatoren") und deren Entsprechung und erläutert die Funktionsweise in Form eineslambda
Verhaltens, das der empfohlenen Funktion entspricht:Dabei ist FUNCTION die Hinweisfunktion und OLDFUN die Funktion, in der der Hinweis hinzugefügt wird. Versuchen Sie nicht, alle auf einmal zu verstehen, wählen Sie einfach ein
WHERE
Symbol aus, das passend klingt, und versuchen Sie, dieses zu verstehen.Oder einfach benutzen
:around
. Soweit ich das beurteilen kann, besteht der einzige Vorteil der Verwendung von spezialisiertenWHERE
s:around
für alles darin, dass Sie ein bisschen mehr Informationen erhalten, wenn SieC-h f ADVISED-FUNCTION
nachschlagen , bevor Sie die Dokumentation des Ratschlags lesen. Sofern Sie nicht vorhaben, den Code mit den Ratschlägen zu veröffentlichen, spielt dies wahrscheinlich keine Rolle.Benannte Beratungsfunktionen
Ich empfehle die Verwendung benannter Funktionen als Hinweis, da dies viele Vorteile bietet (einige davon gelten auch für die Verwendung benannter Funktionen für Hooks):
Es zeigt sich in
C-h f find-file
alsVerknüpfung mit der Definition der Hinweisfunktion, die wie üblich eine Verknüpfung zu der Datei enthält, in der sie definiert wurde. Wenn der Hinweis als
lambda
Formular direkt imadvice-add
Formular definiert worden wäre, würde der Docstring inline angezeigt (ein Durcheinander für lange Docstrings?) Und nichts würde darauf hinweisen, wo er definiert worden wäre.Sie können den Hinweis mit entfernen
Sie können die Definition des Hinweises aktualisieren, ohne
advice-add
die alte Version erneut ausführen zu müssen oder zu riskieren, sie aktiv zu halten (da das Ausführenadvice-add
mit einer geänderten Versionlambda
als neuer Hinweis und nicht als Aktualisierung des alten Hinweises anerkannt wird).Randbemerkung Die
#'function
Notation ist im Wesentlichen gleichbedeutend mit'function
, mit dem Unterschied, dass sie dem Byte-Compiler hilft, Symbole als Funktionsnamen zu identifizieren und somit fehlende Funktionen (z. B. aufgrund von Tippfehlern) zu identifizieren.quelle
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
und in ähnlicher Weise(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
ist ein Grenzfall. Ich persönlich betrachte die' ↔ #'
Unterscheidung hauptsächlich als Hilfe bei der Identifizierung von Tippfehlern in Funktionsnamen, daher hängt es hier wahrscheinlich davon ab, ob man erwartet, dass die Funktion zum Zeitpunkt des Hinzufügens des Hinweises definiert wird.add-function
). Ich wünschte, die Dokumente würden das klarer machen. Ich könnte versuchen, einen Patch dafür zu machen.C-h f find-file
, nichtC-x
?