Next: Basic Major Modes, Previous: Mode Help, Up: Major Modes [Contents][Index]
新しいメジャーモードを定義する推奨された方法は、define-derived-mode
を使用して既存のメジャーモードから派生させる方法です。それほど近いモードが存在しない場合はtext-mode
、special-mode
、またはprog-mode
から継承するべきです。Basic Major Modesを参照してください。これらがどれも適切でない場合は、fundamental-mode
から継承することができます(Major Modesを参照)。
このマクロは、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
をもつ。これは、このフックを実行した後に、最後にrun-mode-hooks
により、自身の祖先のモードのフックを実行する。
これらに加えて、bodyでparentのその他の性質をオーバーライドする方法を指定できます。コマンドvariantはー、通常のオーバーライドをセットアップした後、そのモードのフックを実行する直前にbody内のフォームを評価します。
parentが非nil
のmode-class
シンボルプロパティをもつ場合、define-derived-mode
はvariantのmode-class
プロパティに、同じ値をセットします。これは、たとえばparentがspecialモードの場合は、variantもspecialモードになることを保証します(Major Mode Conventionsを参照)。
parentにたいしてnil
を指定することもできます。これにより、新たなモードは親をもたなくなります。その後、define-derived-mode
は上述のように振る舞いますが、当然parentにつながるすべてのアクションは省略されます。
引数docstringは、新たなモードにたいするドキュメント文字列を指定します。define-derived-mode
は、このドキュメント文字列の最後にそのモードフックに関する一般的な情報と、その後にそのモードのキーマップを追加します。docstringを省略した場合は、define-derived-mode
がドキュメント文字列を生成します。
keyword-argsは、キーワードと値のペアーです。値は評価されます。現在、以下のキーワードがサポートされています:
:syntax-table
新たなモードにたいする構文テーブルを明示的に指定するために、これを使用できる。nil
値を指定した場合、新たなモードはparentと同じ構文テーブル、parentもnil
の場合は標準的な構文テーブルを使用する(これは、nil
値の非キーワード引数は引数を指定しないのと同じという通常の慣習にはしたがわないことに注意されたい)。
:abbrev-table
新たなモードにたいするabbrevテーブルを明示的に指定するために、これを使用できる。nil
値を指定した場合、新たなモードはparentと同じabbrevテーブル、parentもnil
の場合は、fundamental-mode-abbrev-table
を使用する(繰り返すが、nil
値はこのキーワードを指定しないことではない)。
:group
これが指定された場合、値はそのモードにたいするカスタマイズグループ(customization
group)であること(すべてのメジャーモードがカスタマイズグループをもつ訳ではない)。(まだ実験的かつ未公表だが)現在のところ、これを使用するのはcustomize-mode
コマンドだけである。define-derived-mode
は、指定されたカスタマイズグループを自動的に定義しない。
以下は架空の例である:
(define-derived-mode hypertext-mode text-mode "Hypertext" "ハイパーテキスト用のメジャーモード \\{hypertext-mode-map}" (setq case-fold-search nil)) (define-key hypertext-mode-map [down-mouse-3] 'do-hyper-link)
define-derived-mode
が自動的に行うので、この定義内にinteractive
指定を記述してはならない。
この関数は、シンボルmodesで与えられたメジャーモードのいずれかから、カレントメジャーモードが派生された場合は非nil
をリターンする。