대화식으로 그 작업을 수행하는 데 도움이되는 코드가 있습니다.
이것은 두 가지 기능을 정의합니다. 첫 번째 함수는 주어진 기호에 대한 모든 조언의 목록을 가져오고 두 번째 함수는 대화식으로 기호와 해당 기호에 대한 조언을 요청한 후 후자를 전자에서 제거합니다. 이 모든 것이 완료되면 발생하므로 람다 식을 붙여 넣는 것보다 쉽습니다.
(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) advice-remove는 함수를 찾을 때까지 함수에 전달하는 함수를 비교합니다 하나는eq
그것을 제거하고 그것을 제거합니다. (3) advice-remove가와 같은 다른 테스트를 사용하더라도equal
람다 형태의 다른 평가는 서로 다르기 때문에 여전히 작동하지 않습니다equal
. (1) 밝혀 정확하지만 (2)와 (3) 잘못된 : 조언-제거 사용equal
하고, 동일한 평가lambda
를 두 번 생산equal
결과를!