Next: Auto Major Mode, Up: Major Modes [Contents][Index]
メジャーモードにたいするすべてのコードはさまざまなコーディング規約にしたがうべきであり、それらの規約にはローカルキーマップおよび構文テーブルの初期化、関数名や変数名、フックにたいする規約が含まれます。
define-derived-modeマクロを使用すれば、これらの規約を自動的に配慮します。Derived Modesを参照してください。FundamentalモードはEmacsのデフォルト状態を表すモードなので、これらの規約が該当しないことに注意してください。
以下の規約リストはほんの一部です。一般的にすべてのメジャーモードはEmacs全体が首尾一貫するよう、他のEmacsメジャーモードとの一貫性を目指すべきです。ここでこの問題を洗い出すすべての想定される要点をリストするのは不可能です。自身の開発するメジャーモードが通常の規約を逸脱する領域を示すような場合には、Emacs開発者は互換性を保つようにしてください。
そのユーザー自身のキーバインディングに自動的に適合してヘルプが表示されるように、ドキュメント文字列に特別なドキュメントサブストリング‘\[command]’、‘\{keymap}’、‘\<keymap>’を含めるとよいかもしれない。Keys in Documentationを参照のこと。
kill-all-local-variablesを呼び出すことによって開始すること。これはノーマルフックchange-major-mode-hookを実行してから、前のメジャーモードで効力のあったバッファーローカル変数を解放する。Creating Buffer-Localを参照のこと。
major-modeにメジャーモードコマンドのシンボルをセットすること。これはdescribe-modeがプリントするドキュメントを探す手掛かりとなる。
mode-nameにそのモードの“愛称(pretty
name)”をセットすること(これは通常は文字列だが他の利用可能な形式についてはMode Line Dataを参照)。このモード名はモードラインに表示される。
indent-line-functionに適切な関数をセットするとともに、インデント用のその他の変数をカスタマイズするべきだろう。Auto-Indentationを参照のこと。
use-local-mapを呼び出すこと。詳細はActive Keymapsを参照されたい。
このキーマップはmodename-mode-mapという名前のグローバル変数に永続的に格納されること。そのモードを定義するライブラリーは、通常はこの変数をセットする。
モード用のキーマップ変数をセットアップするコードの記述する方法に関するアドバイスはTips for Definingを参照されたい。
メジャーモードはM-n、M-p、M-sなどのキーもリバインドできる。M-nとM-pにたいするバインディングは、通常は 前方か後方への移動を意味するような類のものであるべきだが、これが必ずしもカーソル移動を意味する必要はない。
そのモードにより適した方法でテキストに同じ処理を行うコマンドを提供する場合に、メジャーモードが標準的なキーシーケンスをリバインドするのは正当性がある。たとえばプログラム言語を編集するためのメジャーモードは、その言語にとってより良く機能する方法で、C-M-aを関数の先頭に移動するように再定義できる。
ある標準的なキーシーケンスの標準的な意味がそのモードではほとんど役に立たないような場合にも、メジャーモードが標準的なキーシーケンスをリバインドする正当性がある。たとえばM-rの標準的な意味はミニバッファーではほとんど使用されないので、このキーシーケンスをリバインドする。テキストの自己挿入を許さないDiredやRmailのようなメジャーモードがアルファベット文字や、その他のプリント文字を特別なコマンドに再定義することには正当性がある。
modename-mode-syntax-tableという名前の変数にそれを格納すること。Syntax Tablesを参照されたい。
modename-mode-abbrev-tableという名前の変数にそれを格納すること。メジャーモードコマンドが自身で何らかのabbrevを定義する場合には、define-abbrevのsystem-flag引数にtを渡すこと。Defining Abbrevsを参照されたい。
font-lock-defaultsにバッファーローカルな値をセットすることによって、Font
Lockモードにたいしてハイライトする方法を指定すること(Font Lock Modeを参照)。
imenu-generic-expression、imenu-prev-index-position-functionとimenu-extract-index-name-functionの2つの変数、または変数imenu-create-index-functionにバッファーローカルな値をセットすることによってImenuがバッファー内の定義やセクションを探す方法を指定すること(Imenuを参照)。
eldoc-documentation-functionにローカル値を指定して、ElDocモードがそのモードを処理する方法を指定できる。
completion-at-point-functionsに1つ以上のバッファーローカルエントリーを追加することにより、さまざまなキーワードの補完方法を指定できる。Completion in Buffersを参照のこと。
make-variable-buffer-localではなくメジャーモードコマンド内でmake-local-variableを使用すること。関数make-variable-buffer-localはそれ以降にカスタマイズ変数をセットするすべてのバッファーにたいしてその変数をローカルにして、そのモードを使用しないバッファーにたいしても影響があるだろう。そのようなグローバルな効果はモードにとって好ましくない。Buffer-Local Variablesを参照のこと。
稀な例外としてLispパッケージ内でmake-variable-buffer-localを使用する唯一の正当な方法は、そのパッケージ内でのみ使用される変数にたいして使用をする場合である。他のパッケージにより使用される変数にたいしてこの関数を使用すると競合が発生するだろう。
modename-mode-hookという名前のノーマルなモードフック(mode
hook)をもつこと。メジャーモードコマンドはrun-mode-hooksの呼び出しを一番最後に行うこと。これはノーマルフックchange-major-mode-after-body-hook、モードフック、その後にafter-change-major-mode-hookを実行する。Mode Hooksを参照のこと。
define-derived-modeマクロの使用だが必須ではない。そのようなモードはdelay-mode-hooksフォーム内で親のモードコマンドを呼び出すこと(define-derived-modeは自動的にこれを行う)。Derived ModesとMode Hooksを参照されたい。
change-major-mode-hookにたいしてバッファーローカル値をセットアップできる(Creating Buffer-Localを参照)。
mode-classという名前のプロパティに値specialをputすること:
(put 'funny-mode 'mode-class 'special)
これはEmacsにたいしてカレントバッファーがFunnyモードのときに新たなバッファーを作成したとき、たとえmajor-modeのデフォルト値がnilであってもそのバッファーをFunnyモードにしないよう指示する。デフォルトではmajor-modeにたいする値nilは新たなバッファー作成時にカレントバッファーのメジャーモードを使用することを意味するが(Auto Major Modeを参照)、specialなモードにたいしてはかわりにFundamentalモードが使用される。Dired、Rmail、Buffer
Listのようなモードはこの機能を使用する。
関数view-bufferはmode-classがspecialであるようなバッファーではViewモードを有効にしない。そのようなモードは通常は自身でViewに相当するバインディングを提供するからである。
define-derived-modeマクロは親モードがspecialなら、自動的に派生モードをspecialにマークする。親モードでspecialモードが有用ならそれを継承したモードでも有用だろう。Basic Major Modesを参照のこと。
auto-mode-alistに要素を追加する。autoload用にモードコマンドを定義する場合には、autoloadを呼び出すのと同じファイル内にその要素を追加すること。モードコマンドにたいしてautoload
cookieを使用する場合はに、その要素を追加するフォームにたいしてもautoload cookieを使用できる(autoload cookieを参照)。モードコマンドをautoloadしない場合には、モード定義を含むファイル内で要素を追加すれば十分である。
defvarかdefcustomを使用する(Defining Variablesを参照)。