既存のメジャーモードのコードでは、 ローカルキーマップや構文テーブルの初期化、グローバルな名前、フックなどの さまざまなコーディング上の慣習を踏襲しています。 読者が新たなメジャーモードを定義するときには、 これらの慣習に従ってください。
describe-mode
)を使うと、
この説明文字列を表示する。
説明文字列では、‘\[command]’、‘\{keymap}’、 ‘\<keymap>’の特別な書き方を使え、 これらはユーザー独自のキーバインディングに自動的に置き換えられる。 see Keys in Documentation。
kill-all-local-variables
の呼び出しから始めること。
それ以前に有効であったメジャーモードのバッファローカルな変数に
対処するためである。
major-mode
にメジャーモードコマンドのシンボルを設定すること。
これにより、describe-mode
が表示すべき説明文を捜し出す。
mode-name
にモードの『愛称』を文字列として設定すること。
この文字列がモード行に現れる。
use-local-map
を呼び出して、
そのローカルキーマップを設定すること。
詳しくは、see Active Keymaps。
このキーマップは、modename-mode-map
という名前の
グローバル変数に恒久的に保持すること。
通常、モードを定義するライブラリでこの変数に設定する。
モードのキーマップ変数に設定するコードの書き方に関する助言については see Tips for Defining。
メジャーモードにおいては、そのモードによく適合した形で 『同じ仕事』を行うコマンドであるならば、 標準的な意味を持つキー列に当該コマンドを再バインドしても合理的である。 たとえば、プログラム言語編集用のメジャーモードでは、 C-M-aを当該言語にうまく適合した方法で 『関数の先頭へ移動する』コマンドに再定義する。
テキスト挿入を許さないdiredやrmailなどのメジャーモードでは、 英文字や他の印字文字を編集コマンドとして再定義するのも合理的である。 diredもrmailもこうしている。
-mode-syntax-table
という名前の変数に保持すること。
see Syntax Tables。
-mode-abbrev-table
という名前の変数に保持すること。
see Abbrev Tables。
font-lock-defaults
(see Font Lock Mode)に設定して、
フォントロック(font-lock)モードに対して強調表示の方法を指定すること。
imenu-generic-expression
か
imenu-create-index-function
(see Imenu)に設定して、
iメニューがどのようにバッファ内の定義や節を探すべきかを指定すること。
defvar
かdefcustom
を使い、
それらに値が設定されている場合には再初期化しないようにする。
(再初期化するとユーザーのカスタマイズを廃棄してしまう。)
make-variable-buffer-local
ではなく
make-local-variable
で行う。
前者の関数は、すべてのバッファにおいてそれ以降に設定される当該変数を
バッファローカルにしてしまい、
このモードを使わないバッファにも影響する。
モードにそのような大局的な効果があるのは望ましくない。
see Buffer-Local Variables。
単一のLispパッケージ内のみにおいて使われる変数に対しては、
必要ならば、make-variable-buffer-local
を使ってもよい。
-mode-hook
という名前の
モードフック(mode hook)があること。
モードコマンドは、最後にrun-hooks
を用いてフックを実行すること。
see Hooks。
indented-text-mode
は、
indented-text-mode-hook
に加えてtext-mode-hook
も実行する。
自前のフックを実行する直前(つまり設定が終ったあと)
にこれらの他のフックを実行するか、より初期の段階で実行してもよい。
change-major-mode-hook
(see Creating Buffer-Local)
のバッファローカルな値を設定しておく。
mode-class
に値special
を設定しておくこと。
(put 'funny-mode 'mode-class 'special)
これは、カレントバッファがfunnyモードのときに新たなバッファを 作成しても、新しいバッファではfunnyモードを継承しないようにEmacsに指示する。 dired、rmail、バッファ一覧などのモードではこの機能を使っている。
auto-mode-alist
に追加する。
モードコマンドを自動ロードと定義する場合、
autoload
を呼び出している同じファイルに
そのような要素を追加しておくこと。
そうでなければ、モード定義を収めたファイルに当該要素を入れるだけで十分である。
see Auto Major Mode。
autoload
の例、
auto-mode-alist
への追加方法の例を記載すること。