이름없는 조언을 어떻게 제거 할 수 있습니까?


12

함수에 조언을 추가하는 것이 재미있었습니다.

(advice-add 'executable-find :around
            (lambda (f &rest args)
              (apply g args)))
               ;;;   ^

오타. 그것을 수정하고 위의 코드를 다시 평가했습니다. 그러나 이제는 그 기능에 대한 "수정 된"및 "파손 된"조언을 모두 가지고 있습니다.

이를 제거하려면 어떻게해야합니까? advice-remove함수 객체 또는 주변 조언 이 필요하다면 (여기서는 비어 있음)?

(분명히 종료하고 다시 시작할 수는 있지만 다른 방법이 있습니까?)

답변:


7

또한 호출 할 수 있습니다 advice-remove, 즉, 같은 람다 식으로 대체 advice-add하여 advice-remove삭제 :around한 후, C-x C-e.


작동합니다! 나는 그렇지 않을 것이라고 생각했습니다. (1) 람다 양식을 평가할 때마다 eq이전 함수가 아닌 새로운 함수를 얻습니다 . (2) advice-remove는 함수를 찾을 때까지 함수에 전달하는 함수를 비교합니다 하나는 eq그것을 제거하고 그것을 제거합니다. (3) advice-remove가와 같은 다른 테스트를 사용하더라도 equal람다 형태의 다른 평가는 서로 다르기 때문에 여전히 작동하지 않습니다 equal. (1) 밝혀 정확하지만 (2)와 (3) 잘못된 : 조언-제거 사용 equal하고, 동일한 평가 lambda를 두 번 생산 equal결과를!
Omar

질문을했는데 답변을받지 못했습니다. 상황에 가장 도움이되는 IMO이기 때문에 본인을 선택합니다.
Daniel Jour

11

advice-mapc주어진 함수를 각각에 적용하여 어떤 함수의 모든 조언을 반복 할 수있게하는가 있다 . 이를 통해 모든 조언을 쉽게 제거 할 수 있습니다.

(advice-mapc
  (lambda (adv prop)
    (advice-remove 'executable-find adv))
  'executable-find)

이것은 key와 관련된 것을 가지고 있지 않은 사람들 name에 대한 두 번째 ( props) 인수 (목록) 를 살펴봄 으로써 속성 이없는 조언 만 제거하도록 확장 될 수 있습니다 name.


예. 그리고를 사용하면 name쉽게 제거 할 수 있습니다.
Drew

1

대화식으로 그 작업을 수행하는 데 도움이되는 코드가 있습니다.

이것은 두 가지 기능을 정의합니다. 첫 번째 함수는 주어진 기호에 대한 모든 조언의 목록을 가져오고 두 번째 함수는 대화식으로 기호와 해당 기호에 대한 조언을 요청한 후 후자를 전자에서 제거합니다. 이 모든 것이 완료되면 발생하므로 람다 식을 붙여 넣는 것보다 쉽습니다.

(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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.