artscanは実行可能な回答で彼自身の質問に答えましたが、それは少し不完全で誤解を招くものです。これには も含ま'interactive
れており、それ自体が混乱を招く可能性があります。コマンドの本体内で定義されているように見えますが、実際には関数に入る前に使用され、アドバイスが実行される前に使用されます (そのアドバイスに'interactive
呼び出しがある場合を除く)。 ...)
アドバイスのドキュメントには、この状況で役立つ多くの詳細が欠けているため、実際にはソースを参照することをお勧めします: advice.el
. それを見て、コメントセクションを見つけてください@ Foo games: An advice tutorial
。を使用して、Emacs 自体でソースを見つけることもできますM-x find-library advice RET。
具体的には、この問題については、advice.el
ラベルの付いたセクションを見@@ Advising interactive behavior:
てください。それがまさにあなたがやろうとしていることだからです。
よく読んでみると、アドバイスがの形式である必要はなく、その形式でもかまいません。これは、が特別に扱われている (そしてそうしなければならない) ためです。around
before
after
interactive
したがって、次のコードが機能します ( に注意してくださいbefore
)。
(defadvice find-dired (before eab-find-dired (dir args) activate)
"ignore find-args, hard code \"-iname '**'\""
(interactive
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " '("-iname '**'" . 10)
'(find-args-history . 1)))))
他の人が示唆したように、おそらくこれを行うためのよりクリーンな方法は、独自の関数を作成することです。最も簡単なのはLindydancer 's answerだと思います。
アドバイスは非常に魅力的なツールですが、使いすぎがちです。危険とまでは言いませんが、慎重に使用してください。独自の関数を作成してもうまくいかない場合に使用するのが最適なようです。たとえば、変更できないコードによって呼び出される関数の動作を変更する場合などです。この状況の良い例は、ここ、ここ、およびここで見つけることができると思います(自分の角を鳴らすために)。