次: Defining Advice, 前: Disassembly, 上: Advising Functions
コマンドnext-lineは、ポイントを垂直に複数行移動します。
標準バインドはC-nです。
バッファの最終行で使うと、
(next-line-add-newlinesがnil以外の場合)
このコマンドは行を作るために改行を挿入し、その行に移動します。
同様な機能をprevious-lineに追加したいとします。
つまり、バッファの先頭に新たな行を挿入し、その行へ移動するのです。
どのようにすればよいでしょう?
当該関数を再定義すればできますが、それではモジュール性がよくありません。 アドバイス機能が見通しのよい代替方法を提供します。 既存の関数定義を実際に変更したりその定義を参照することなく、 関数定義に読者のコードを実質的に追加できます。 つぎのように行います。
(defadvice previous-line (before next-line-at-end (arg))
"Insert an empty line when moving up from the top line."
(if (and next-line-add-newlines (= arg 1)
(save-excursion (beginning-of-line) (bobp)))
(progn
(beginning-of-line)
(newline))))
この式は、関数previous-lineに対するアドバイス断片を定義します。
このアドバイス断片にはnext-line-at-endという名前が付きます。
シンボルbeforeにより、
previous-lineの通常の定義を実行するまえに実行する
事前アドバイス(before-advice)であることを意味します。
(arg)は、アドバイス断片がどのように関数の引数を参照するかを指定します。
このアドバイス断片が実行されると、必要な場面では新たに行を作りますが、 その行へはポイントを移動しません。 これはアドバイスを書く正しいやりかたです。 というのは、通常の定義がこのあとに実行され、新たに挿入した行へ移動します。
アドバイスを定義しても関数previous-lineをただちには変更しません。
つぎのようにアドバイスを活性にすると変わります。
(ad-activate 'previous-line)
これにより、関数previous-lineに対して定義してある
アドバイスを使い始めます。
これ以降、C-pやM-xでユーザーが起動したのか
Lispから呼ばれたのかに関わらず、
この関数を起動すると、まずアドバイスを実行してから
関数の通常の定義を実行します。
この例は、アドバイスの1つのクラスである事前アドバイスの例であり、 関数の元定義のまえに実行されます。 他に2つのアドバイスクラスがあります。 元定義のあとに実行される事後アドバイス(after-advice)と 元定義の起動を包み込む式を指定する包囲アドバイス(around-advice)です。