Next: リージョン全体のインデント, Previous: インデント用のプリミティブ, Up: インデント [Contents][Index]
すべてのメジャーモードにとって重要な関数は、編集対象の言語にたいして正しくインデントを行うようにTABキーをカスタマイズします。このセクションではTABキーのメカニズムと、それを制御する方法について説明します。このセクションの関数は予期せぬ値をリターンします。
これはほとんどの編集用モードでTABにバインドされるコマンド。これの通常の動作はカレント行のインデントだが、かわりにタブ文字の挿入やリージョンのインデントを行うこともできる。
これは以下のことを行う:
indent-region
を呼び出す(リージョン全体のインデントを参照)。
indent-line-function
内のインデント関数がindent-to-left-margin
の場合、または変数tab-always-indent
が挿入する文字としてタブ文字を指定する場合(以下参照)にはタブ文字を挿入する。
indent-line-function
内の関数を呼び出すことにより行われる。その行がすでにインデント済みで、かつtab-always-indent
の値がcomplete
(以下参照)ならポイント位置のテキストの補完を試みる。
rigidが非nil
(インタラクティブな場合はプレフィクス引数)なら、このコマンドが行をインデントした後、あるいはタブを挿入後に新たなインデントを反映するために、このコマンドはカレント行先頭にある釣り合いのとれた式全体も厳正にインデントする。この引数はコマンドがリージョンをインデントする場合は無視される。
この変数の値はカレント行をインデントするためにindent-for-tab-command
、およびその他種々のインデントコマンドにより使用される関数。これは通常はメジャーモードにより割り当てられ、たとえばLispモードはこれをlisp-indent-line
、Cモードはc-indent-line
のようにセットする。デフォルト値はindent-relative
。コードの自動インデントを参照のこと。
このコマンドはカレントのメジャーモードに適した方法でカレント行をインデントするためにindent-line-function
内の関数を呼び出す。
この関数は改行を挿入後に、メジャーモードに応じて新たな行(挿入した改行の次の行)をインデントする。これはindent-according-to-mode
を呼び出すことによりインデントを行う。
このコマンドはカレント行の再インデント、ポイント位置への改行の挿入、その後に新たな行(挿入した改行の次の行)のインデントを行う。これはindent-according-to-mode
を呼び出すことにより両方の行をインデントする。
この変数はTAB
(indent-for-tab-command
)コマンドの挙動のカスタマイズに使用できる。値がt
(デフォルト)ならコマンドは通常はカレント行だけをインデントする。値がnil
ならコマンドはポイントが左マージン、またはその行のインデント内ににあるときのみカレント行をインデントして、それ以外はタブ文字を挿入する。値がcomplete
ならコマンドはまずカレント行のインデントを試みて、その行がすでにインデント済みならポイント位置のテキストを補完するためにcompletion-at-point
を呼び出す(通常バッファーでの補完を参照)。
tab-always-indent
がcomplete
なら、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
にしたがうべきです。
この変数が非nil
なら副モードのインデントエンジンにたいして上位モードが提供するインデントのコンテキストを保持する。値は(first-column
. rest)
という形式のリストであること。リストのメンバーは以下の意味をもつ:
トップレベルの構文にたいして使用する列。これは副モードが使用するトップレベルの列のデフォルト値(通常は0)を置き換える。
現在のところ使用しない。
以下は他のメジャーモードの副モードとしての呼び出しをサポートする際に、そのメジャーモードのインデントエンジンが使用するべき便宜用の関数です。
トップレベルのプログラム上のコンテキストの列値にたいしてリテラル値(通常は0)を使用するかわりにこの関数を呼び出す。関数の値はトップレベルに使用する列数。上位モードの影響下になければ関数は0をリターンする。