Next: , Previous: , Up: メジャーモードとマイナーモード   [Contents][Index]


24.2 メジャーモード

メジャーモードは特定の種類のテキストの編集や相互作用にたいしてEmacsを特化します。すべてのバッファーは一度に1つのメジャーモードをもちます。すべてのメジャーモードは、メジャーモードコマンド(major mode command)に関連付けられ、そのコマンド名は‘-mode’で終わるべきです。このコマンドは、ローカルキーマップのようなさまざまなバッファーローカル変数をセットすることにより、カレントバッファー内でそのモードに切り替える配慮をします。メジャーモードの慣習を参照してください。マイナーモードとは異なりメジャーモードを“オフに切り替える”手段は存在せず、かわりにバッファーは別のメジャーモードに切り替えられなければなりません。しかしメジャーモードを一時的にサスペンドして、後でサスペンドしたモードをリストアできます。以下を参照してください。

Fundamentalモードと呼ばれるモードはもっとも特化されていないメジャーモードであり、モード特有な定義や変数セッティングをもちません。

Command: fundamental-mode

これはFundamentalモードにたいするメジャーモードコマンドである。他のモードコマンドと異なり、このモードはカスタマイズしてはならないことになっているので、モードフックは何も実行されない(メジャーモードの慣習を参照)。

Function: major-mode-suspend

この関数はすべてのバッファーローカル変数をkillする点においてfundamental-modeのように機能するが、これは後でリストアできるように効力をもつメジャーモードを記録する。この関数とmajor-mode-restore (以下参照)は、Emacsがそのバッファー用に自動的に選択したモード(Emacsがメジャーモードを選択する方法を参照)ではない何らかの特化したモードにバッファーを置く必要があり、なおかつ後で元のモードに戻れるようにしたい場合に有用。

Function: major-mode-restore &optional avoided-modes

この関数はmajor-mode-suspendが記録したメジャーモードをリストアする。メジャーモードが何も記録されていなければ、この関数はnormal-mode (normal-modeを参照)を呼び出すが、avoided-modes引数が非nilならこの引数内のモードを選択させないように試みる。

Function: clean-mode

メジャーモード変更によってほとんどのローカル変数はクリアーされるが、バッファー内に残された残置物(テキストプロパティやオーバーレイなど)がすべて削除される訳ではない。あるバッファーのメジャーモードを別のモードに変更することは稀であり、これは通常なら問題にならない(fundamental-modeからそれ以外のメジャーモードへの変更は除く)。バッファーの“完全リセット”を行うことができれば、(主としてバッファーでの問題をデバッグ中には)便利なときがあるかもしれず、正にそれがメジャーモードclean-modeの提供する機能である。これはすべてのローカル変数(永続的なローカル変数さえも)をkillするとともに、すべてのオーバーレイおよびテキストプロパティを削除する。

メジャーモードを記述するもっとも簡単な方法はマクロdefine-derived-modeを使用する方法です。これは既存のメジャーモードを変形して新たなモードをセットアップします。派生モードの定義を参照してください。define-derived-modeは多くのコーディング規約を自動的に強要するので、たとえ新たなモードが他のモードから明示的に派生されない場合でも、わたしたちはdefine-derived-modeの使用を推奨します。派生元とするための一般的なモードについては基本的なメジャーモードを参照してください。

標準的なGNU EmacsのLispディレクトリーツリーには、いくつかのメジャーモードがtext-mode.eltexinfo.ellisp-mode.elrmail.elのようなファイルとして含まれています。モードの記述方法を確認するために、これらのライブラリーを学ぶことができます。

User Option: major-mode

この変数のバッファーローカル値はカレントのメジャーモードにたいするシンボルを保持する。この変数のデフォルト値は新たなバッファーにたいするデフォルトのメジャーモードを保持する。標準的なデフォルト値はfundamental-modeである。

デフォルト値がnilなら、C-x b (switch-to-buffer)のようなコマンドを通じてEmacsが新たなバッファーを作成したとき、新たなバッファーは以前カレントだったバッファーのメジャーモードになる。例外として以前のバッファーのメジャーモードのシンボルプロパティmode-classが値specialをもつ場合には、新たなバッファーはFundamentalモードになる(メジャーモードの慣習を参照)。