Answers:
您还可以advice-remove
使用相同的lambda表达式进行调用,即,先替换advice-add
为advice-remove
and delete :around
,然后再进行C-x C-e。
这是一些代码,可帮助以交互方式完成此任务。
这定义了两个功能。第一个功能获取有关给定符号的所有建议的列表,第二个功能以交互方式询问一个符号和该符号的建议,然后从前一个中删除后者。由于这一切都是在完成时发生的,(对我而言)比复制粘贴lambda表达式容易。
(defun yf/advice-list (symbol)
(let (result)
(advice-mapc
(lambda (ad props)
(push ad result))
symbol)
(nreverse result)))
(defun yf/kill-advice (symbol advice)
"Kill ADVICE from SYMBOL."
(interactive (let* ((sym (intern (completing-read "Function: " obarray #'yf/advice-list t)))
(advice (let ((advices-and-their-name
(mapcar (lambda (ad) (cons (prin1-to-string ad)
ad))
(yf/advice-list sym))))
(cdr (assoc (completing-read "Remove advice: " advices-and-their-name nil t)
advices-and-their-name)))))
(list sym advice)))
(advice-remove symbol advice))
eq
以前的函数;(2)建议删除会比较将其传递给建议的函数,直到找到为止一个是eq
它并删除,(3)即使意见-删除使用不同的测试,比如equal
,它仍然是行不通的,因为lambda形式的不同的评价不会equal
彼此。事实证明(1)是正确的,但是(2)和(3)是错误的:advice-remouse使用equal
,并对它进行lambda
两次评估会产生equal
结果!