A seguito di una risposta a un'altra domanda sul nuovo sistema di consulenza :
In vecchio stile advice.el
, era possibile manipolare singoli membri dell'elenco di argomenti di una funzione consigliata, senza fare affermazioni su quei membri non così manipolati. Ad esempio, il seguente consiglio:
(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))
consente la fornitura (facoltativa) di un argomento buffer-name a una ansi-term
chiamata, mentre ansi-term
otterrà comunque il suo primo argomento chiedendo in base al proprio modulo interattivo.
(Per riferimento futuro, ansi-term
la firma è (PROGRAM &optional BUFFER-NAME)
e il suo modulo interattivo richiede PROGRAMMA con diverse possibili impostazioni predefinite, ma non fa nulla riguardo a BUFFER-NAME.)
Non sono sicuro se questo sia possibile o meno nadvice.el
. Se lo è, non sono sicuro di come si possa fare. Ho trovato un paio di modi per sostituire l'elenco degli argomenti di una funzione consigliata.
Ad esempio, da * info * (elisp) Combinatori di consigli :
`: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)))
Altri combinatori offrono capacità simili e il filo conduttore tra loro è che, mentre l'elenco di argomenti di una funzione può essere sostituito, troncato, esteso, ecc., Non esiste un modo apparente per i consigli di funzione di modificare l'argomento in una determinata posizione nell'elenco senza affermando qualcosa sul resto .
Nel caso in esame, sembra impossibile per l'autore del consiglio passare ansi-term
solo un nome di buffer, poiché non è possibile costruire un elenco che abbia un valore nella posizione 1 ma nulla, nemmeno nil
, nella posizione 0. Nel caso generale, sembra impossibile per l'autore della consulenza modificare arbitrariamente argomenti oltre la posizione 0.
Ciò sembra sfortunato in quanto, per produrre un effetto simile, è necessario copiare e incollare il codice: in particolare, o posso copiare ansi-term
il modulo interattivo ed estenderlo secondo i miei gusti, oppure posso copiarlo del ansi-term
tutto ed estenderlo allo stesso modo. In entrambi i casi, ora devo ridefinire parte della distribuzione di Emacs Lisp nel mio file init, che mi sembra indesiderabile in termini sia di durata che di estetica.
La mia domanda, quindi, è: si può fare questo tipo di elenco degli argomenti con la manomissione nadvice.el
? Se é cosi, come?