Next: , Previous: , Up: Major Modes   [Contents][Index]


22.2.6 モードフック

すべてのメジャーモードコマンドはモード独自のノーマルフックchange-major-mode-after-body-hook、そのモードのモードフック、ノーマルフックafter-change-major-mode-hookを実行することによって終了すべきです。これはrun-mode-hooksを呼び出すことにより行われます。もしそのモードが派生モードなら自身のbody内で他のメジャーモード(親モード)を呼び出す場合には、親モードが自身でこれらのフックを実行しないようにdelay-mode-hooksの中でこれを行うべきです。かわりに派生モードは親のモードフックも実行するrun-mode-hooksを呼び出します。Major Mode Conventionsを参照してください。

Emacs 22より前のバージョンのEmacsにはdelay-mode-hooksがありません。またEmacs 24より前のバージョンにはchange-major-mode-after-body-hookがありません。ユーザー実装のメジャーモードがrun-mode-hooksを使用せず、これらの新しい機能を使用するようにアップデートされていないときは、これらのメジャーモードは以下の慣習に完全にしたがわないでしょう。それらのモードは親のモードフックをあまりに早く実行したり、after-change-major-mode-hookの実行に失敗するかもしれません。そのようなメジャーモードに遭遇したら以下の慣習にしたがって修正をお願いします。

define-derived-modeを使用してメジャーモードを定義したときは、自動的にこれらの慣習にしたがうことが確実になります。define-derived-modeを使用せずにメジャーモードを“手動”で定義した場合は、これらの慣習を自動的に処理するように、以下の関数を使用してください。

Function: run-mode-hooks &rest hookvars

メジャーモードはこの関数を使用してそれらのモードフックを実行すること。これはrun-hooks (Hooksを参照)と似ているが、change-major-mode-after-body-hookafter-change-major-mode-hookも実行する。

この関数がdelay-mode-hooksフォーム実行中に呼び出されたときはそれらのフックを即座には実行しない。かわりに次のrun-mode-hooks呼び出しでそれらを実行するようにアレンジする。

Macro: delay-mode-hooks body…

あるメジャーモードコマンドが他のメジャーモードコマンドを呼び出すときはdelay-mode-hooksの内部で行うこと。

このマクロはbodyを実行するが、body実行中はすべてのrun-mode-hooks呼び出しにたいしてそれらのフックの実行を遅延するよう指示する。それらのフックは実際にはdelay-mode-hooks構造の最後の後、次のrun-mode-hooks呼び出しの間に実行されるだろう。

Variable: change-major-mode-after-body-hook

これはrun-mode-hooksにより実行されるノーマルフックである。これはそのモードのフックの前に実行される。

Variable: after-change-major-mode-hook

これはrun-mode-hooksにより実行されるノーマルフックである。これはすべての適切に記述されたメジャーモードコマンドの一番最後に実行される。