新しいアドバイスシステムに関する別の質問への回答に続きます。
古いスタイルadvice.el
では、アドバイスされた関数の引数リストの個々のメンバーを操作することは可能でしたが、それらのメンバーに関する操作は行われませんでした。たとえば、次のアドバイス:
(defadvice ansi-term (around prompt-for-name last)
(let ((name (read-from-minibuffer "Tag: ")))
(and (not (string= name ""))
(ad-set-arg 1 (concat "Term: " name)))
ad-do-it))
ansi-term
呼び出しに対するbuffer-name引数の(オプションの)提供を許可しますが、ansi-term
独自の対話形式に従ってプロンプトを表示することにより、最初の引数を取得します。
(後で参照するため、ansi-term
の署名は(PROGRAM &optional BUFFER-NAME)
であり、その対話形式はいくつかの可能なデフォルトでPROGRAMを要求しますが、BUFFER-NAMEに関しては何もしません。)
これが可能かどうかはわかりませんnadvice.el
。もしそうなら、私はそれがどのように行われるか確信がありません。アドバイスされた関数の引数リストを置き換えるいくつかの方法を見つけました。
たとえば、* info *(elisp)アドバイスコンビネータから:
`:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to pass to the old function. More specifically, the composition of the two functions behaves like: (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
他のコンビネータは、同様の機能を提供し、それらの間の共通のスレッドは、関数の引数リストを交換することができる一方で、切り捨て、拡張、らは、リスト内の指定された位置で引数を変更するための機能のアドバイスのための明らかな方法はありません、それをあるなしそれの残りについて何かを主張します。
議論中のケースでは、アドバイス作成者がansi-term
バッファ名のみを渡すことは不可能に見えます。なぜなら、位置1に値を持ち、nil
位置0には何もない、さらにはリストを作成することができないからです。アドバイスの作成者が位置0を超えて引数を任意に変更することは不可能と思われます。
これは、同様の効果を生み出すために、コードをコピーansi-term
アンドペーストする必要があるという点で不幸に思えます:具体的には、のインタラクティブなフォームをコピーして自分の好みに合わせて拡張するか、ansi-term
すべてコピーして同様に拡張することができます。どちらの場合でも、今では、initファイルでEmacs Lispディストリビューションの一部を再定義する必要があります。これは、耐久性と美観の両方の点で望ましくないと感じています。
私の質問は、次のとおりです。この種の引数リストのマングリングは次のようにできますnadvice.el
か?もしそうなら、どのように?