Praktische Vorteile des neuen Ratgebersystems in Emacs 24.4

53

Emacs 24.4 wird mit einem neuen Hinweissystem ausgeliefert. In der NEWSDatei steht:

** Das neue Paket nadvice.elbietet leichtere Beratungseinrichtungen. Es ist geschichtet als:

*** add-function/ remove-function, mit dem Code an jedem funktionsbehafteten Ort hinzugefügt / entfernt werden kann, z. B. bei Prozessfiltern oder <foo>-functionHooks.

*** advice-add/ advice-removeHinzufügen / Entfernen eines Ratschlags zu einer benannten Funktion, ähnlich wie dies der defadviceFall ist.

F: Was sind die praktischen Vorteile und Auswirkungen dieses neuen Pakets?

Ich bin besonders an Antworten interessiert, die folgende Punkte ansprechen:

  • Muss ich auf das neue System umsteigen, wenn ich nur Ratschläge zum Anpassen von Emacs verwende (im Gegensatz zum Schreiben von Add-On-Paketen)? Wird es irgendwann das alte System ersetzen?

  • Was genau kann ich mit dem neuen System tun, mit dem ich nichts anfangen kann defadvice?

  • Was bedeutet es, an jedem funktionsbehafteten Ort Code hinzufügen / entfernen zu können?

itsjeyd
quelle

Antworten:

57

Das neue Beratungssystem bietet folgende Vorteile:

  • add-function: Dies ist brandneue Funktionalität, die einfach nicht Teil des Defadvice war. Es ist eine Art Hybrid zwischen add-hookund defadvice. Erwarten Sie in Zukunft mehr foo-function(geänderte Via add-function) und weniger foo-functions(geänderte Via add-hook) Variablen . Diese Funktionalität war die Hauptmotivation für die Implementierung des neuen Ratgebersystems, ausgelöst durch einen Fehlerbericht, in dem gefragt wurde, wie ein Prozessfilter zwischen verschiedenen Paketen "geteilt" werden soll.

  • add-functionEinfache Implementierung: Nach der Implementierung sind nur 8 KB erforderlich, um die advice-addFunktionalität zu implementieren, die nahezu die gesamte Funktionalität von 100 KB von advice.el bietet.

  • Einfaches Design: Defadvice hat verschiedene Begriffe, die im Allgemeinen schwer zu verstehen sind und / oder nur selten verwendet werden. ZB der Unterschied zwischen "Aktivieren" und "Aktivieren" von Hinweisen. Oder die Bedeutung von "vor" und / oder "kompiliert". Es gibt auch Macken in der Handhabung ad-do-it, wie die Tatsache, dass es eher wie eine Variablenreferenz als wie ein Aufruf aussieht, oder dass Sie (setq ad-return-value ...)den Wert explizit zurückgeben müssen, anstatt ihn einfach zurückzugeben.

  • Defadvice leidet unter verschiedenen Problemen bei der Makroexpansion und -kompilierung: Der Inhalt eines Hinweises wird nicht als "Code" (den der Compiler und der Makroexpander sehen), sondern als "Daten" dargestellt, die später zu einem Ausdruck kombiniert werden. Daher erfolgt die Makroexpansion zu spät (was bei der Verwendung von Dingen wie überraschend sein kann (eval-when-compile (require 'foo))), und es ist schwierig, das lexikalische Scoping korrekt zu speichern.

Was die Frage betrifft, ob Sie auf das neue System umsteigen müssen: Ich beabsichtige, das alte Defadvice irgendwann in der Zukunft loszuwerden, aber ich denke, diese Zukunft ist relativ weit entfernt (und sie muss erst verschoben werden lisp/obsolete, dann später) zu GNU ELPA).

Stefan
quelle
1
Gibt es Pläne, nadvice.el um dieselbe Funktionalität zur Änderung von Argumenten zu erweitern, die das alte Beratungssystem bietet?
Aaron Miller
Nein, das macht im Kontext von nadvice.el so ziemlich keinen Sinn, wo die Hinweisfunktionen ganz normale Funktionen sind. Aber Sie können verwenden :aroundBeratung (oder :filter-argsoder :filter-resultBeratung) , um den gleichen Effekt zu erzielen.
Stefan
2
Ich kann es aber nicht. Angenommen, ich möchte eine Funktion mit zwei Argumenten empfehlen, wobei nur das zweite Argument ersetzt wird, damit die empfohlene Funktion gemäß ihrer interaktiven Form weiterhin nach dem ersten Argument fragt. Neue Ratschläge scheinen verschiedene Möglichkeiten zu bieten, um die interaktive Form einer empfohlenen Funktion zu ersetzen , aber ich sehe nichts, das nuancierter ist.
Aaron Miller
@AaronMiller: Bitte stellen Sie eine separate SX-Frage, damit diese ohne die künstlichen Grenzen von SX-Kommentaren diskutiert werden kann.
Stefan
Geschehen zu emacs.stackexchange.com/q/19233/2162 . Ich freue mich über Ihr Follow-up. (Ich wäre auch gespannt auf den Fehlerbericht, den Sie in Ihrer Antwort erwähnt haben, konnte ihn aber nicht über Google oder die Archivsuche für Mailinglisten finden. Stört es Sie, ihn zu verlinken?)
Aaron Miller
9

Einer der eindeutigen Vorteile von Ratschlägen für normale Funktionen ist, dass Sie eine Definition mit besuchen können find-function.

Derzeit wird beim Anzeigen der Hilfe für eine (im neuen Stil) empfohlene Funktion ein Link zur Hilfe für die Hinweisfunktion und von dort aus ein Link zur Quelle bereitgestellt (wie bei Funktionshilfen üblich).

Das alte System lieferte den Hinweis docstring inline, aber es gab keine Möglichkeit, den Code zu sehen (auf den ich normalerweise zurückgegriffen habe rgrep).

(Persönlich würde ich gerne eine Mischung aus alten und neuen Ansätzen für die Anzeige der Hilfe sehen, da mir der Inline-Docstring gefallen hat, aber ich bin mir sicher, dass dies später möglich ist.)

Phils
quelle
2
Ja, es ist schade, dass Sie mit dem neuen Ratgebersystem nicht wie gewohnt die vorhandene Dokumentzeichenfolge ergänzen können defadvice. Siehe diesen Emacs-Fehlerbericht . Das ist ein Mangel.
Drew
8

Aus dem Dateiheader:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

Wie ich es lese, ist es das primäre Ziel, einfacher als das alte Ratgebersystem zu sein und nicht mehr Fähigkeiten zu haben. Das Lesen der Dokumentation scheint advice-addeine Teilmenge der defadviceFunktionen zu enthalten, während add-functioneinige nützliche Funktionen für die Empfehlung nicht traditioneller Funktionen wie Prozessfilter enthalten sind (was wahrscheinlich mit möglich war defadvice, aber ich bin nicht sicher, wie).

Soweit ich weiß, defadviceist es nicht offiziell veraltet, so dass Sie sich frei fühlen sollten, es vorerst weiter zu verwenden (und wenn Sie ein Paketautor sind, möchten Sie es wahrscheinlich weiter verwenden, bis 24.4 weiter verbreitet wird). Es hört sich jedoch so an, als wollten die Emacs-Autoren irgendwann vollständig auf das neue System migrieren. Daher ist es wahrscheinlich sinnvoll, langsam umzuschalten.

Shosti
quelle
Ja. Das Neue ist anders, nicht mehr. Und ja, es gibt eine Menge davon defadvice(und das wird auch weiterhin so sein).
Drew
0

Eine Sache , die ich hier nicht erwähnt gesehen - wenn auch in gewisser Weise ist es wegen der einfacheren Ansatz (bessere Modularität und „Klebstoff“) des „neuen“ Beratungssystem, das hat in anderen Antworten erwähnt - ist dies: Es ist viel einfacher, Ratschläge hinzuzufügen, zu kombinieren, zu entfernen, neu zu ordnen usw.

Es ist sogar möglich, dies interaktiv und dynamisch zu tun, obwohl nadvice ein wenig Hilfe benötigt, um dies zu ermöglichen. Mir ist keine andere Verwendung von nadvice auf diese Weise (interaktive Zusammenstellung von Ratschlägen) bekannt, aber es gibt mindestens eine solche Anwendung. Ich benutze es in Isearch + , um Ihnen zu ermöglichen, während der Suche Kombinationen beliebiger Isearch-Filter-Prädikate (Filter) hinzuzufügen und zu entfernen.

IOW, genau wie Sie Ihr Suchmuster schrittweise ändern, können Sie Ihre Suche im Handumdrehen mithilfe mehrerer Filter verfeinern.

Die Suchfilterung erfolgt mit Variablen isearch-filter-predicate, die bereits seit einiger Zeit zur Verfügung stehen. Isearch-Filter werden jedoch nicht häufig definiert. Sie sind in der Regel statisch und für einen bestimmten Kontext vordefiniert (z. B. Wdired). Zumindest interaktiv ist es für Benutzer nicht einfach, sie zu definieren und zu verwenden.

Es gibt nur eine Variable. isearch-filter-predicateWenn Sie also die Filterung ändern, müssen Sie das Prädikat eines einzelnen Filters ändern. Dies bedeutet, dass Funktionen erstellt, Prädikate kombiniert, die Suche eingegrenzt, erweitert oder auf andere Weise geändert werden.

Aber genau das kann nadvice. Insgesamt ist nadvice so praktisch, um Funktionen zu kombinieren, dass es einfach ist, die Suchfilterung interaktiv zu verfeinern. (Weitere Informationen hierzu finden Sie unter Dynamische Suchfilterung .)

Drew
quelle