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
に適切な関数をセットするとともに、インデント用のその他の変数をカスタマイズすべきだろう。
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
and
imenu-extract-index-name-function
、または変数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を参照)。