すべてのメジャーモードコマンドは、モードに依存しない通常フック change-major-mode-after-body-hook、そのモードフック、および通常フック
after-change-major-mode-hook
を実行して終了する必要があります。これは、run-mode-hooks
を呼び出すことで行われます。メジャーモードが派生モードである場合、すなわち本体内で別のメジャーモード(親モード)を呼び出す場合は、親モードがこれらのフックを自身で実行しないよう、delay-mode-hooks 内でこれを行う必要があります。代わりに、派生モードによる run-mode-hooks の呼び出しが、親モードのモードフックも実行します。メジャーモードの規約 を参照してください。
Emacs 22 より前のバージョンには delay-mode-hooks がありませんでした。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、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
によって実行される通常のフックです。正しく記述されたすべてのメジャーモードコマンドの最後に実行されます。