Next: 古いdefadviceを使用するコードの改良, Previous: 名前つき関数にたいするアドバイス, Up: Emacs Lisp関数にたいするアドバイス [Contents][Index]
以下はadd-function
とadvice-add
のwhere引数に可能な値であり、そのアドバイスfunctionと元の関数が構成される方法を指定します。
:before
古い関数の前にfunctionを呼び出す。関数は両方とも同じ引数を受け取り、2つの関数の結合のリターン値は古い関数のリターン値である。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (apply function r) (apply oldfun r))
(add-function :before funvar
function)
はノーマルフックにたいする(add-hook 'hookvar
function)
のような1関数のフックと同等。
:after
古い関数の後にfunctionを呼び出す。関数は両方とも同じ引数を受け取り、2つの関数の結合のリターン値は古い関数のリターン値である。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))
(add-function :after funvar
function)
はノーマルフックにたいする(add-hook 'hookvar function
'append)
のような1関数のフックと同等。
:override
これは古い関数を新しい関数に完全に置き換える。もちろんremove-function
を呼び出した後に古い関数が復元される。
:around
古い関数のかわりにfunctionを呼び出すが、古い関数はfunctionの追加の引数になる。これはもっとも柔軟な結合である。たとえば古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になる。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (apply function oldfun r))
:before-while
古い関数の前にfunctionを呼び出し、functionがnil
をリターンしたら古い関数を呼び出さない。関数は両方とも同じ引数を受け取り、2つの関数の結合のリターン値は古い関数のリターン値である。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (and (apply function r) (apply oldfun r)))
(add-function :before-while funvar
function)
はrun-hook-with-args-until-failure
を通じてhookvarが実行されたときの(add-hook
'hookvar function)
のような1関数のフックと同等。
:before-until
古い関数の前にfunctionを呼び出し、functionがnil
をリターンした場合だけ古い関数を呼び出す。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (or (apply function r) (apply oldfun r)))
(add-function :before-until funvar
function)
はrun-hook-with-args-until-success
を通じてhookvarが実行されたときの(add-hook
'hookvar function)
のような1関数のフックと同等。
:after-while
古い関数が非nil
をリターンした場合だけ、古い関数の後にfunctionを呼び出す。関数は両方とも同じ引数を受け取り、2つの関数の結合のリターン値はfunctionのリターン値である。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (and (apply oldfun r) (apply function r)))
(add-function :after-while funvar
function)
はrun-hook-with-args-until-failure
を通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)
のような1関数のフックと同等。
:after-until
古い関数がnil
をリターンした場合だけ、古い関数の後にfunctionを呼び出す。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (or (apply oldfun r) (apply function r)))
(add-function :after-until funvar
function)
はrun-hook-with-args-until-success
を通じてhookvarが実行されたときの(add-hook
'hookvar function 'append)
のような1関数のフックと同等。
:filter-args
最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡す。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return
最初に古い関数を呼び出し、その結果をfunctionに渡す。より正確に言うと2つの関数の結合は以下のように振る舞う:
(lambda (&rest r) (funcall function (apply oldfun r)))