Next: , Previous: , Up: メジャーモード   [Contents][Index]


24.2.4 派生モードの定義

新しいメジャーモードを定義する推奨方法は、define-derived-modeを使用して既存のメジャーモードから派生させる方法です。それほど近いモードが存在しない場合はtext-modespecial-mode、またはprog-modeから継承するべきです。基本的なメジャーモードを参照してください。これらがいずれも適切でなければ、fundamental-modeから継承することができます(メジャーモードを参照)。

Macro: define-derived-mode variant parent name docstring keyword-args… body…

このマクロはvariantをメジャーモードコマンドとして定義して、nameをモード名の文字列形式とする。variantparentはクォートされていないシンボルであること。

新たなコマンドvariantは関数parentを呼び出すよう定義されて、その後その親モードの特定の性質をオーバーライドする。

  • 新たなモードはvariant-mapという名前の、自身のsparseキーマップ(疎キーマップ)をもつ。define-derived-modevariant-mapがすでにセットされていて、かつすでに親をもつ場合を除いて親モードのキーマップを新たなマップの親キーマップにする。
  • 新たなモードは自身の構文テーブル(syntax table)をもち、それは変数variant-syntax-tableに保持される。ただし:syntax-tableキーワード(以下参照)を使用してこれをオーバーライドした場合は異なる。define-derived-modevariant-syntax-tableがすでにセットされていて、かつ標準的な構文テーブルよ異なる親をもつ場合を除いて、親モードの構文テーブルをvariant-syntax-tableの親とする。
  • 新たなモードは自身のabbrevテーブル(略語テーブル)をもち、それは変数variant-abbrev-tableに保持される。ただし:abbrev-tableキーワード(以下参照)を使用してこれをオーバーライドした場合は異なる。
  • 新たなモードは自身のモードフックvariant-hookをもつ。これはフックを実行した後に:after-hookがあればそれを実行して、それとは別に最後にrun-mode-hooksによって自身の祖先のモードのフックを実行する。

これらに加えてbodyparentのその他の性質をオーバーライドする方法を指定できます。コマンドvariantは通常のオーバーライドをセットアップした後、そのモードのフックを実行する直前にbody内のフォームを評価します。

parentが非nilmode-classシンボルプロパティをもつ場合、define-derived-modevariantmode-classプロパティに同じ値をセットします。これはたとえばparentがspecialモードならvariantもspecialモードになることを保証します(メジャーモードの慣習を参照)。

parentにたいしてnilを指定することもできます。これにより新たなモードは親をもたなくなります。その後にdefine-derived-modeは上述のように振る舞いますが、当然parentにつながるすべてのアクションは省略されます。反対に新たなモードの祖先を明示的にセットするために、derived-mode-set-parentderived-mode-add-parentsを使うことができます(以下参照)。

引数docstringは新たなモードにたいするドキュメント文字列を指定します。define-derived-modeはこのドキュメント文字列の最後にそのモードフックに関する一般的な情報と、その後にそのモードのキーマップを追加します。docstringを省略するとdefine-derived-modeがドキュメント文字列を生成します。

keyword-argsはキーワードと値のペアー。:after-hookのものを除いて値は評価される。現在のところ以下のキーワードがサポートされる:

:syntax-table

新たなモードにたいする構文テーブルを明示的に指定するためにこれを使用できる。nil値を指定すると新たなモードはparentと同じ構文テーブル、parentnilなら標準的な構文テーブルを使用する(これはnil値の非キーワード引数は引数を指定しないのと同じという通常の慣習にはしたがわないことに注意)。

:abbrev-table

新たなモードにたいするabbrevテーブルを明示的に指定するためにこれを使用できる。nil値を指定すると新たなモードはparentと同じabbrevテーブル、parentnilならfundamental-mode-abbrev-tableを使用する(繰り返すがnil値はこのキーワードを指定しないことではない)。

:interactive

モードはデフォルトではインタラクティブコマンド。nil値を指定すると、ここで指定したモードはインタラクティブにならない。これはユーザーが手動でアクティブにされることはないが、特別にフォーマットされたバッファーでのみ使用されることを意図したモードで有用。

:group

これが指定する場合、値はそのモードにたいするカスタマイズグループ(customization group)であること(すべてのメジャーモードがカスタマイズグループをもつ訳ではない)。customize-modeコマンドはこれを使用する。define-derived-modeは指定されたカスタマイズグループを自動的に定義しない

:after-hook

このオプションのkeyはモードフック実行後にモード関数の最後の活動として評価される単一のLispフォームを指定する。クォートしないこと。モードにが終了した後にフォーが評価されるので、モード関数のローカル状態のすべての要素にアクセスするべきではない。:after-hookフォームはモードフックで変更されているかもしれないユーザーのセッティングに依存するモードの様相をセットアップするために有用。

以下は架空の例:

(defvar-keymap hypertext-mode-map
  "<down-mouse-3>" #'do-hyper-link)

(define-derived-mode hypertext-mode
  text-mode "Hypertext"
  "ハイパーテキスト用のメジャーモード"
  (setq-local case-fold-search nil))

define-derived-modeが自動的に行うので、この定義内にinteractive指定を記述してはならない。

Function: derived-mode-p modes

この関数はカレントメジャーモードがシンボルのリストmodesで与えられたメジャーモードのいずれかから派生されていたら非nilをリターンする。modesはリストではなく単独のモードシンボルでもよい。

さらに個別の引数としてmodesを渡す廃止された呼び出し規約も依然としてサポートされている。

この関数はカレントメジャーモードの親モードを調べる際にはdefine-derived-modeでセットされたカレントモードの親モード、さらに下記のderived-mode-add-parentsでセットされた追加の親モードも考慮する。

Function: provided-mode-derived-p mode modes

この関数はmodesにセットされたシンボルのリストによって与えられるメジャーモードのいずれかをmodeが継承していれば非nilをリターンする。derived-mode-pの場合と同じようにmodesは単一のシンボルでもよく、さらに個別のシンボル引数としてmodesを渡す廃止された呼び出し規約もサポートされている。

この関数はmodeの親モードを調べる際にはdefine-derived-modeでセットされたmodeの親モード、さらに下記のderived-mode-add-parentsでセットされた追加の親モードも考慮する。

あるメジャーモードの祖先の家系図グラフは、以下の低レベル関数によってアクセスや変更が可能です:

Function: derived-mode-set-parent mode parent

この関数はmodeparentから派生していることを宣言する。これはdefine-derived-modemodeを定義した後に、parentを再利用してmodeが定義されたという事実を登録するために呼び出す関数である。

Function: derived-mode-add-parents mode extra-parents

この関数はmodeの定義時に用いられた親と別の親モードの登録を可能にする。これはmodeextra-parentsの愛だに類似性があり、たとえばディレクトリーローカル変数やその他のモード固有のセッティングを適用する等の目的のためにmodeをこれらのモードの子モードとして扱うことに意味がある際に使用できる。追加の親モードはextra-parentsにセットされたシンボルのリストとして指定される。これらの親モードはderived-mode-pおよびprovided-mode-derived-pにより、modeの親モードのいずれかとみなされることになる。

Function: derived-mode-all-parents mode

この関数はmodeの祖先となるすべてのモードのリストを、modeを先頭に具体性の大きいものから小さい順でリターンする。もしあればderived-mode-add-parents呼び出しで追加された追加の親モードも含まれる。

This page has generated for branch:emacs-30, commit:ab5505a8acf795c0a0a2745dd6fb666954c6a4bb to check Japanese translation.