フックとは、既存のプログラムが特定のタイミングで呼び出すための関数(関数とは何か?を参照)を格納できる変数のことです。Emacsでは、カスタマイズを目的としてフックが提供されています。多くの場合、フックはinitファイル(initファイルを参照)で設定されますが、Lispプログラムで設定することも可能です。標準的なフック変数の一覧については、標準フックを参照してください。
Emacsのフックの多くはノーマルフックです。これらの変数には、引数なしで呼び出される関数のリストが格納されています。慣習として、フック名が‘-hook’で終わる場合は、それがノーマルフックであることを示しています。すべてのフックを可能な限りノーマルフックにすることで、統一的な方法で利用できるようにしています。
すべてのメジャーモードコマンドは、初期化の最終段階の一つとして、モードフックと呼ばれる通常のフックを実行することになっています。これにより、ユーザーはモードによって既に行われたバッファローカル変数への代入をオーバーライドすることで、モードの動作を簡単にカスタマイズできます。ほとんどのマイナーモード関数も、最後にモードフックを実行します。しかし、フックは他のコンテキストでも使用されます。例えば、フック
suspend-hook は、Emacs がサスペンドする直前に実行されます(Emacs のサスペンドを参照)。
フック変数の名前が ‘-hook’ で終わっていない場合、それはおそらく 異常フック であることを示しています。これらは通常のフックとは2つの点で異なります。1つ以上の引数を指定して呼び出せる点と、戻り値を何らかの形で利用できる点です。フックのドキュメントには、関数の呼び出し方法や戻り値の利用方法が記載されています。異常フックに追加される関数は、必ずそのフックの呼び出し規約に従わなければなりません。慣習として、異常フックの名前は ‘-functions’ で終わります。
変数名が ‘-predicate’ または ‘-function’(単数形)で終わる場合、その値は関数リストではなく関数である必要があります。異常なフックと同様に、こうした 単一関数フック では、想定される引数や戻り値の意味が異なります。詳細は各変数の docstring で説明されています。
フック(マルチ関数およびシングル関数の両方)は変数であるため、その値は setq
で変更したり、let
で一時的に変更したりできます。しかし、フックが持つ他の関数を保持したまま、特定の関数を追加または削除したい場合が多くあります。マルチ関数フックの場合、推奨される方法は
add-hook と remove-hook
を使用することです(フックの設定
を参照)。ほとんどの通常のフック変数は初期状態で void であり、add-hook
がこれを適切に処理します。フックは、add-hook
を使用してグローバルに、あるいはバッファローカルに追加できます。シングル関数のみを保持するフックの場合、add-hook は適しませんが、add-function
(Emacs Lisp 関数へのアドバイジング
を参照)を使用して、新しい関数をフックに組み込むことができます。なお、一部のシングル関数フックは nil であり、add-function
では処理できないため、add-function を呼び出す前にその点を確認する必要があります。