名前のないアドバイスを削除するにはどうすればよいですか?


12

私は関数にいくつかのアドバイスを追加して楽しんでいました:

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

痛い、タイプミス。それを修正し、上記のコードを再度評価しました。しかし今、私はその機能に関する「修正された」および「壊れた」アドバイスの両方を持っています。

これらを取り除くにはどうすればよいですか?ことを考えるとadvice-removeニーズが関数オブジェクトまたは(ここでは空である)周りのアドバイスのいずれか?

(明らかに、私は単に終了して再起動できますが、別の方法がありますか?)

回答:


7

あなたも呼び出すことができadvice-remove、すなわち、同じラムダ式で置き換えるadvice-addadvice-remove、削除:around、その後、C-x C-e


これでうまくいきます!私はそうではないと思いました、(1)ラムダフォームを評価するたびにeq以前の関数とは異なる新しい関数を取得します、(2)Advice-Removは、それが見つかるまで、渡した関数をアドバイスに比較しますあるものeqこれにアドバイス・削除が異なるテストを使用する場合でも、(3)、それを除去し、等equal、それはまだ動作しない、ラムダ形の異なる評価がないのでequalお互い。(1)が判明正しいのですが、(2)及び(3)は間違っている:アドバイス-削除用途equal、および同じ評価をlambda二度作り出すequal結果を!
Omar

質問したところ、返事を受け取っていないことに気づきました。状況でIMOが最も役立つので、私はYoursを選択します。
Daniel Jour

11

ありますadvice-mapcこれはLETの1回の反復は、それぞれに与えられた関数を適用し、いくつかの機能のすべてのアドバイスの上に、。これを使用すると、すべてのアドバイスを簡単に削除できます。

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

これは、keyに関連付けられていないもののname2番目の(props)引数(リスト)を調べることで、プロパティを持たないアドバイスのみを削除するように拡張できますname


はい。そして、を使用するとname、削除が簡単になります。
ドリュー

1

これをインタラクティブに行うのに役立つコードを次に示します。

これは2つの関数を定義します。最初の関数は特定のシンボルに関するすべてのアドバイスのリストを取得し、2番目の関数はインタラクティブにシンボルとそのシンボルに関するアドバイスを要求し、後者を前者から削除します。これはすべて完了時に行われるため、ラムダ式をコピーして貼り付けるよりも(私にとって)簡単です。

(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.