フック(hook)とは既存のプログラムから特定のタイミングで呼び出される関数(複数可)を格納できる変数のことです(関数とは?を参照)。Emacsはカスタマイズ用にフックを提供します。ほとんどの場合にはinitファイル内(initファイルを参照)でフックをセットアップしますが、Lispプログラムもフックをセットできます。標準的なフック変数のリストは標準的なフックを参照してください。
Emacsのほとんどのフックはノーマルフック(normal hooks)です。これらの変数は、引数なしで呼び出される関数のリストを含んでいます。慣習により名前が‘-hook’で終わるフックは、そのフックがノーマルフックであることを意味します。わたしたちは一貫した方法でフックを使用できるように、すべてのフックが可能な限りノーマルフックとなるよう努力しています。
すべてのメジャーモードコマンドは、初期化の最終ステップの1つとして、モードフック(mode
hook)と呼ばれるノーマルフックを実行するとみなされます。これによってそのモードですでに作成されたバッファーローカル変数割り当てをオーバーライドすることにより、ユーザーがそのモードの動作をカスタマイズするのが簡単になります。ほとんどのマイナーモード関数も最後にモードフックを実行します。しかしフックは他のコンテキストでも使用されます。たとえばフックsuspend-hook
は、Emacsが自身をサスペンド(Emacsのサスペンドを参照)する直前に実行されます。
フック変数の名前が‘-hook’で終わらなければ、それが恐らくアブノーマルフック(abnormal hook)であることを示しています。これらとノーマルフック違うのはフック関数が1つ以上の引数とともに呼ぶ出されること、何らかの方法によってそのリターン値が使用されることという2つの点です。その関数の呼び出し方や引数の使われ方はそのフックのドキュメントに記載されています。アブノーマルフックに追加する関数は、フックの呼び出し規約にしたがって関数を記述しなければなりません。慣習によりアブノーマルフックの名前の最後は‘-functions’です。
変数名の最後が‘-predicate’や‘-function’ (単数形)なら、値は関数のリストではなく単一の関数でなければなりません。このような単一関数フック(single function hook)が期待する引数やリターン値の意味はアブノーマルフックと同様さまざまです。それらの詳細については、各変数のdocstringで説明されています。
フック(単一関数と複数関数の両方)とは変数なので、値はsetq
、または一時的にlet
で変更できます。しかしフックがもつ他の関数を保持しつつ、特定の関数の追加や削除ができると便利なことがあります。複数関数フックでこれを行う推奨方法はadd-hook
とremove-hook
です(フックのセットを参照)。ほとんどのノーマルフック変数の初期値はvoidであり、add-hook
はこれを扱う方法を理解しています。フックへのグローバルまたはバッファーローカルな追加はadd-hook
で行うことができます。単一の関数だけを保持するフックではadd-hook
は不適切ですが、フックに新たな関数を組み合わせるためにadd-function
(Emacs Lisp関数にたいするアドバイスを参照)を使用できます。いくつかの単一関数フックはadd-function
が扱えないnil
かもしれないので、add-function
の呼び出し前にそれをチェックしなければならないことに注意してください。