Next: , Previous: , Up: インデント   [Contents][Index]


33.17.2 メジャーモードが制御するインデント

すべてのメジャーモードにとって重要な関数は、編集対象の言語にたいして正しくインデントを行うようにTABキーをカスタマイズします。このセクションではTABキーのメカニズムと、それを制御する方法について説明します。このセクションの関数は予期せぬ値をリターンします。

Command: indent-for-tab-command &optional rigid

これはほとんどの編集用モードでTABにバインドされるコマンド。これの通常の動作はカレント行のインデントだが、かわりにタブ文字の挿入やリージョンのインデントを行うこともできる。

これは以下のことを行う:

  • まずTransient Markモードが有効かどうか、そしてリージョンがアクティブかどうかをチェックする。もしそうならリージョン内のテキストすべてをインデントするためにindent-regionを呼び出す(リージョン全体のインデントを参照)。
  • それ以外ならindent-line-function内のインデント関数がindent-to-left-marginの場合、または変数tab-always-indentが挿入する文字としてタブ文字を指定する場合(以下参照)にはタブ文字を挿入する。
  • それ以外ならカレント行をインデントする。これはindent-line-function内の関数を呼び出すことにより行われる。その行がすでにインデント済みで、かつtab-always-indentの値がcomplete(以下参照)ならポイント位置のテキストの補完を試みる。

rigidが非nil (インタラクティブな場合はプレフィクス引数)なら、このコマンドが行をインデントした後、あるいはタブを挿入後に新たなインデントを反映するために、このコマンドはカレント行先頭にある釣り合いのとれた式全体も厳正にインデントする。この引数はコマンドがリージョンをインデントする場合は無視される。

Variable: indent-line-function

この変数の値はカレント行をインデントするためにindent-for-tab-command、およびその他種々のインデントコマンドにより使用される関数。これは通常はメジャーモードにより割り当てられ、たとえばLispモードはこれをlisp-indent-line、Cモードはc-indent-lineのようにセットする。デフォルト値はindent-relativeコードの自動インデントを参照のこと。

Command: indent-according-to-mode

このコマンドはカレントのメジャーモードに適した方法でカレント行をインデントするためにindent-line-function内の関数を呼び出す。

Command: newline-and-indent

この関数は改行を挿入後に、メジャーモードに応じて新たな行(挿入した改行の次の行)をインデントする。これはindent-according-to-modeを呼び出すことによりインデントを行う。

Command: reindent-then-newline-and-indent

このコマンドはカレント行の再インデント、ポイント位置への改行の挿入、その後に新たな行(挿入した改行の次の行)のインデントを行う。これはindent-according-to-modeを呼び出すことにより両方の行をインデントする。

User Option: tab-always-indent

この変数はTAB (indent-for-tab-command)コマンドの挙動のカスタマイズに使用できる。値がt(デフォルト)ならコマンドは通常はカレント行だけをインデントする。値がnilならコマンドはポイントが左マージン、またはその行のインデント内ににあるときのみカレント行をインデントして、それ以外はタブ文字を挿入する。値がcompleteならコマンドはまずカレント行のインデントを試みて、その行がすでにインデント済みならポイント位置のテキストを補完するためにcompletion-at-pointを呼び出す(通常バッファーでの補完を参照)。

User Option: tab-first-completion

tab-always-indentcompleteなら、tab-first-completion変数を介して拡張するか、それともインデントするかを更にカスタマイズできる。以下の値を使用できる:

eol

ポイントが行末にあれば補完のみ。

word

次の文字が単語構文をもたなければ補完。

word-or-paren

次の文字が単語構文やカッコでなければ補完。

word-or-paren-or-punct

次の文字が単語構文やカッコや句読点でなければ補完。

いずれの場合でも、2回目のTABの結果は常に補完となる。

いくつかのメジャーモードでは、異なるメジャーモードに所属する構文をもつ埋め込みのテキストリージョンをサポートする必要があります。これらの例にはドキュメントとソースコード断片の組み合わせである文芸的プログラミング(literate programming)のソースファイル、PythonやJSのコード断片を含んだYacc/Bisonプログラムが含まれます。埋め込みチャンクをを正しくインデントするためには、主モードがインデントをガイドする何らかのコンテキストを提供しつつ、他のモードのインデントエンジン(JSではjs-indent-line、Pythonではpython-indent-lineの呼び出し)にインデントを委譲する必要があります。メジャーモードはインデントコードでwidenの呼び出しを避けてprog-first-columnにしたがうべきです。

Variable: prog-indentation-context

この変数が非nilなら副モードのインデントエンジンにたいして上位モードが提供するインデントのコンテキストを保持する。値は(first-column . rest)という形式のリストであること。リストのメンバーは以下の意味をもつ:

first-column

トップレベルの構文にたいして使用する列。これは副モードが使用するトップレベルの列のデフォルト値(通常は0)を置き換える。

rest

現在のところ使用しない。

以下は他のメジャーモードの副モードとしての呼び出しをサポートする際に、そのメジャーモードのインデントエンジンが使用するべき便宜用の関数です。

Function: prog-first-column

トップレベルのプログラム上のコンテキストの列値にたいしてリテラル値(通常は0)を使用するかわりにこの関数を呼び出す。関数の値はトップレベルに使用する列数。上位モードの影響下になければ関数は0をリターンする。