在旧式中advice.el
,可以操纵建议函数的参数列表的各个成员,而不必对未操纵的那些成员做出任何断言。例如,以下建议:
(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))
允许为ansi-term
调用提供(可选)缓冲区名称参数,同时ansi-term
仍会通过根据其自身的交互形式进行提示来获取其第一个参数。
(供以后参考,ansi-term
的签名为(PROGRAM &optional BUFFER-NAME)
,其交互形式提示PROGRAM带有多个可能的默认值,但对BUFFER-NAME无效。)
我不确定是否可以在中进行nadvice.el
。如果是这样,我不确定该怎么做。我发现了几种替换建议函数的参数列表的方法。
例如,来自* info *(elisp)咨询组合:
`: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)))
其他组合器也提供类似的功能,并且它们之间的共同点是,尽管函数的参数列表可能会被替换,截断,扩展等,但是没有明显的方法建议函数修改列表中给定位置的参数而没有断言其余一切。
在所讨论的情况下,建议作者似乎无法ansi-term
仅传递缓冲区名称,因为不可能构造一个在位置1处有值但nil
在位置0处没有值甚至没有的值的列表。在一般情况下,建议作者似乎无法随意修改位置0以外的参数。
为了产生类似的效果,这似乎是不幸的,必须复制粘贴代码:特别是,我可以复制ansi-term
的交互形式并将其扩展到我的喜好,或者我可以ansi-term
完全复制并同样地扩展它。无论哪种情况,我现在都必须在init文件中重新定义Emacs Lisp发行版的一部分,这在持久性和美观性方面都使我感到不满意。
那么,我的问题是:可以使用这种参数列表处理nadvice.el
吗?如果是这样,怎么办?