すべてのメジャーモードコマンドはモード独自のノーマルフックchange-major-mode-after-body-hook
、そのモードのモードフック、ノーマルフックafter-change-major-mode-hook
を実行することによって終了すべきです。これはrun-mode-hooks
を呼び出すことにより行われます。もしそのモードが派生モードなら自身のbody内で他のメジャーモード(親モード)を呼び出す場合には、親モードが自身でこれらのフックを実行しないようにdelay-mode-hooks
の中でこれを行うべきです。かわりに派生モードは親のモードフックも実行するrun-mode-hooks
を呼び出します。メジャーモードの慣習を参照してください。
Emacs 22より前のバージョンのEmacsにはdelay-mode-hooks
がありません。またEmacs
24より前のバージョンにはchange-major-mode-after-body-hook
がありません。ユーザー実装のメジャーモードがrun-mode-hooks
を使用せず、これらの新しい機能を使用するようにアップデートされていないときは、これらのメジャーモードは以下の慣習に完全にしたがわないでしょう。それらのモードは親のモードフックをあまりに早く実行したり、after-change-major-mode-hook
の実行に失敗するかもしれません。これによりdefine-globalized-minor-mode
で定義されたマイナーモードがこれらのメジャーモードを使用するバッファーで妨害されるという、望ましくない影響が生じるでしょう。そのようなメジャーモードに遭遇したら以下の慣習にしたがって修正をお願いします。
define-derived-mode
を使用してメジャーモードを定義したときは、自動的にこれらの慣習にしたがうことが保証されます。define-derived-mode
を使用せずにメジャーモードを“手動”で定義したら、これらの慣習を自動的に処理するように以下の関数を使用してください。
メジャーモードはこの関数を使用してモードフックを実行すること。これはrun-hooks
(フックを参照)と似ているがchange-major-mode-after-body-hook
、(バッファーがファイルをvisitしていれば)hack-local-variables
(ファイルローカル変数を参照)、after-change-major-mode-hook
も実行する。これは最後に親モード(派生モードの定義を参照)で宣言されている:after-hook
フォームをすべて評価する。
この関数がdelay-mode-hooks
フォーム実行中に呼び出されたときはフックやhack-local-variables
の実行、およびフォームの評価を即座には行わない。かわりに次のrun-mode-hooks
呼び出しでそれらを実行するようにアレンジする。
あるメジャーモードコマンドが他のメジャーモードコマンドを呼び出すときはdelay-mode-hooks
の内部で行うこと。
このマクロはbodyを実行するが、body実行中はすべてのrun-mode-hooks
呼び出しにたいしてそれらのフックの実行を遅延するよう指示する。それらのフックは実際にはdelay-mode-hooks
構造の最後の後、次のrun-mode-hooks
呼び出しの間に実行されるだろう。
これはrun-mode-hooks
により実行されるノーマルフックである。これはそのモードのフックの前に実行される。
これはrun-mode-hooks
により実行されるノーマルフックである。これはすべての適切に記述されたメジャーモードコマンドの一番最後に実行される。