Im Anschluss an eine Antwort auf eine andere Frage zum neuen Beratungssystem :
Im alten Stil advice.el
war es möglich, einzelne Mitglieder der Argumentliste einer empfohlenen Funktion zu manipulieren, ohne Aussagen zu denjenigen Mitgliedern zu machen, die nicht so manipuliert wurden. Zum Beispiel die folgenden Ratschläge:
(defadvice ansi-term (around prompt-for-name last)
(let ((name (read-from-minibuffer "Tag: ")))
(and (not (string= name ""))
(ad-set-arg 1 (concat "Term: " name)))
ad-do-it))
Ermöglicht die (optionale) Bereitstellung eines Puffernamen-Arguments für einen ansi-term
Aufruf, wobei ansi-term
das erste Argument weiterhin durch Aufforderung gemäß seiner eigenen interaktiven Form erhalten wird.
(Zum späteren Nachschlagen ansi-term
lautet die Signatur (PROGRAM &optional BUFFER-NAME)
und das interaktive Formular fordert zur Eingabe von PROGRAM mit mehreren möglichen Standardwerten auf, hat jedoch keine Auswirkungen auf BUFFER-NAME.)
Ich bin mir nicht sicher, ob dies möglich ist oder nicht nadvice.el
. Wenn es so ist, bin ich mir nicht sicher, wie es gemacht werden kann. Ich habe verschiedene Möglichkeiten gefunden, um die Argumentliste einer empfohlenen Funktion zu ersetzen .
Zum Beispiel von * info * (elisp) Hinweiskombinatoren :
`:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to pass to the old function. More specifically, the composition of the two functions behaves like: (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
Andere Kombinatoren bieten ähnliche Funktionen, und der gemeinsame Nenner besteht darin, dass die Argumentliste einer Funktion zwar ersetzt, abgeschnitten, erweitert usw. werden kann, es jedoch keine offensichtliche Möglichkeit für Funktionsempfehlungen gibt, das Argument an einer bestimmten Position in der Liste ohne zu ändern etwas über den Rest davon zu behaupten .
Im vorliegenden Fall scheint es dem Ratgeber unmöglich zu sein, ansi-term
nur einen Puffernamen zu übergeben, da es nicht möglich ist, eine Liste zu erstellen, die einen Wert an Position 1 hat, aber nichts, nicht einmal nil
an Position 0. Im allgemeinen Fall Es erscheint dem Ratgeber unmöglich, Argumente über Position 0 hinaus willkürlich zu ändern.
Dies scheint insofern bedauerlich, als es zum Erzeugen eines ähnlichen Effekts notwendig ist, Code zu kopieren und einzufügen: Konkret kann ich entweder die ansi-term
interaktive Form kopieren und nach meinem Geschmack erweitern, oder ich kann sie ansi-term
insgesamt kopieren und ebenfalls erweitern. In beiden Fällen muss ich jetzt einen Teil der Emacs-Lisp-Distribution in meiner Init-Datei neu definieren, was mir sowohl hinsichtlich der Haltbarkeit als auch der Ästhetik als unerwünscht erscheint.
Meine Frage ist also: Kann man mit einer solchen Liste von Argumenten fertig werden nadvice.el
? Wenn das so ist, wie?