前: Mode Help, 上: Major Modes
既存のメジャーモードを用いて新たなメジャーモードを定義できると便利です。
これを行う簡単な方法はdefine-derived-mode
を使うことです。
これは、nameをモード名を表す文字列として使って variantをメジャーモードコマンドとして定義する。
新たなコマンドvariantは、関数parentを呼び出してから 親モードの特定の機能を無効にするように定義される。
- 新たなモードは、variant
-map
という名前の 独自のキーマップを持つ。define-derived-mode
は、 このキーマップが定義済みでなければ、 parent-map
から継承するようにこのキーマップを初期化する。- 新たなモードでは、変数にvariant
-syntax-table
に 独自の構文テーブルを保持する。 この変数が定義済みでなければ、 parent-syntax-table
をコピーしてこの変数を初期化する。- 新たなモードでは、変数にvariant
-abbrev-table
に 独自の略語表を保持する。 この変数が定義済みでなければ、 parent-abbrev-table
をコピーしてこの変数を初期化する。- 新たなモードには独自のモードフックvariant
-hook
があり、 通常どおり最後にこれを実行する。 (新たなモードでは、parentを呼び出すことの一部として parentのモードフックも実行する。)さらに、bodyでparentの他の部分を無効にする方法を指定できる。 コマンドvariantは、variant
-hook
を呼び出す直前、 通常の無効化処理を終えてからbodyのフォームを評価する。引数docstringは、新たなモードに対する説明文字列を指定する。 docstringを省略すると、
define-derived-mode
は説明文字列を生成する。仮想的な例を示す。
(define-derived-mode hypertext-mode text-mode "Hypertext" "Major mode for hypertext. \\{hypertext-mode-map}" (setq case-fold-search nil)) (define-key hypertext-mode-map [down-mouse-3] 'do-hyper-link)