Next: 基本的なメジャーモード, Previous: メジャーモードでのヘルプ入手, Up: メジャーモード [Contents][Index]
新しいメジャーモードを定義する推奨方法は、define-derived-mode
を使用して既存のメジャーモードから派生させる方法です。それほど近いモードが存在しない場合はtext-mode
、special-mode
、またはprog-mode
から継承するべきです。基本的なメジャーモードを参照してください。これらがいずれも適切でなければ、fundamental-mode
から継承することができます(メジャーモードを参照)。
このマクロはvariantをメジャーモードコマンドとして定義して、nameをモード名の文字列形式とする。variantとparentはクォートされていないシンボルであること。
新たなコマンドvariantは関数parentを呼び出すよう定義されて、その後その親モードの特定の性質をオーバーライドする。
variant-map
という名前の、自身のsparseキーマップ(疎キーマップ)をもつ。define-derived-mode
はvariant-map
がすでにセットされていて、かつすでに親をもつ場合を除いて親モードのキーマップを新たなマップの親キーマップにする。
variant-syntax-table
に保持される。ただし:syntax-table
キーワード(以下参照)を使用してこれをオーバーライドした場合は異なる。define-derived-mode
はvariant-syntax-table
がすでにセットされていて、かつ標準的な構文テーブルよ異なる親をもつ場合を除いて、親モードの構文テーブルをvariant-syntax-table
の親とする。
variant-abbrev-table
に保持される。ただし:abbrev-table
キーワード(以下参照)を使用してこれをオーバーライドした場合は異なる。
variant-hook
をもつ。これはフックを実行した後に:after-hook
があればそれを実行して、それとは別に最後にrun-mode-hooks
によって自身の祖先のモードのフックを実行する。
これらに加えてbodyでparentのその他の性質をオーバーライドする方法を指定できます。コマンドvariantは通常のオーバーライドをセットアップした後、そのモードのフックを実行する直前にbody内のフォームを評価します。
parentが非nil
のmode-class
シンボルプロパティをもつ場合、define-derived-mode
はvariantのmode-class
プロパティに同じ値をセットします。これはたとえばparentがspecialモードならvariantもspecialモードになることを保証します(メジャーモードの慣習を参照)。
parentにたいしてnil
を指定することもできます。これにより新たなモードは親をもたなくなります。その後にdefine-derived-mode
は上述のように振る舞いますが、当然parentにつながるすべてのアクションは省略されます。
引数docstringは新たなモードにたいするドキュメント文字列を指定します。define-derived-mode
はこのドキュメント文字列の最後にそのモードフックに関する一般的な情報と、その後にそのモードのキーマップを追加します。docstringを省略するとdefine-derived-mode
がドキュメント文字列を生成します。
keyword-argsはキーワードと値のペアー。:after-hook
のものを除いて値は評価される。現在のところ以下のキーワードがサポートされる:
:syntax-table
新たなモードにたいする構文テーブルを明示的に指定するためにこれを使用できる。nil
値を指定すると新たなモードはparentと同じ構文テーブル、parentもnil
なら標準的な構文テーブルを使用する(これはnil
値の非キーワード引数は引数を指定しないのと同じという通常の慣習にはしたがわないことに注意)。
:abbrev-table
新たなモードにたいするabbrevテーブルを明示的に指定するためにこれを使用できる。nil
値を指定すると新たなモードはparentと同じabbrevテーブル、parentもnil
ならfundamental-mode-abbrev-table
を使用する(繰り返すがnil
値はこのキーワードを指定しないことではない)。
:interactive
モードはデフォルトではインタラクティブコマンド。nil
値を指定すると、ここで指定したモードはインタラクティブにならない。これはユーザーが手動でアクティブにされることはないが、特別にフォーマットされたバッファーでのみ使用されることを意図したモードで有用。
:group
これが指定する場合、値はそのモードにたいするカスタマイズグループ(customization
group)であること(すべてのメジャーモードがカスタマイズグループをもつ訳ではない)。customize-mode
コマンドはこれを使用する。define-derived-mode
は指定されたカスタマイズグループを自動的に定義しない。
:after-hook
このオプションのkeyはモードフック実行後にモード関数の最後の活動として評価される単一のLispフォームを指定する。クォートしないこと。モードにが終了した後にフォーが評価されるので、モード関数のローカル状態のすべての要素にアクセスするべきではない。:after-hook
フォームはモードフックで変更されているかもしれないユーザーのセッティングに依存するモードの様相をセットアップするために有用。
以下は架空の例:
(defvar hypertext-mode-map (let ((map (make-sparse-keymap))) (define-key map [down-mouse-3] 'do-hyper-link) map)) (define-derived-mode hypertext-mode text-mode "Hypertext" "ハイパーテキスト用のメジャーモード" (setq-local case-fold-search nil))
define-derived-mode
が自動的に行うので、この定義内にinteractive
指定を記述してはならない。
この関数はカレントメジャーモードがシンボルmodesで与えられたメジャーモードのいずれかから派生されていたら非nil
をリターンする。