2つの変数でどのコマンドがいつCの字下げを行なうかを制御します.
c-auto-newline
がnon-nil
なら,挿入した中かっこ`{'の
前後,コロンとセミコロンの後ろで改行されます.このようにして作られたすべ
ての行についてCの字下げを調整します.
c-tab-always-indent
がnil
なら,CモードでのTABコマン
ドは,ポイントが左端か,左の字下げの空白の中にあるときだけ字下げを行ない
ます.ポイントの左に空白でない文字があるときは,TABはタブ文字をバッ
ファに挿入します.通常この変数の値はt
でTABはつねに現在行の
字下げをやり直します.
Cには,特殊な形の字下げをする特別な関数名といったものはありません.し かしCには違った意味でのカスタム化の機能が必要です.多くの異なったスタイ ルの字下げが一般に使われています.
Emacsでは6つの変数を設定して,Cモードで扱うCのスタイルを制御します.
c-indent-level
c-continued-statement-offset
c-brace-offset
c-brace-imaginary-offset
c-argdecl-indent
c-label-offset
変数c-indent-level
は,周囲のブロックからのCの文の字下げを決めま
す.たとえば,
{ foo ();
この2つの行は,c-indent-level
分だけ字下げに差があります.その標準
値は2です.
複合文のはじめにある開き中かっこが行の先頭にない場合,
c-indent-level
は開き中かっこの桁にではなく,その行の字下げに加え
られます.たとえば,次のようになります.
if (losing) { do_this ();
よくある字下げのスタイルはc-indent-level
を8にして,開き中かっこを
このように行の終りに置くものです.私は開き中かっこは独立した行にするのが
好みです.
実際には,変数c-brace-imaginary-offset
の値も,このような文の字
下げに加えられます.この変数は通常0です.この変数の値がこの行の最初の空
白でない文字の位置からの想像上の開き中かっこの位置と考えます.この変数を
4にし,c-indent-level
を0にすると,次のスタイルになります.
if (x == y) { do_it (); }
c-indent-level
が0のとき,ほとんどの中かっこの中の文は,その開き
中かっこの真下に並べられます.しかし,第0桁にある関数の本体を囲む中かっ
このときは例外です.その中の文は0桁に移されません.代わりに
c-brace-offset
とc-continued-statement-offset
(下を参照)が中
かっこレベル間での通常のオフセットに加えられ,文はそこまで下げられます.
c-continued-statement-offset
は,文の中で始まる(しかしかっこやブ
ラケットの中では始まらない)行の字下げを制御します.これにあたるのは
if
文のthen節や,while
文の本体のような他の文の中の文です.
このパラメータは,次の2行間の字下げとなります.
if (x == y) do_it ();
標準値は2です.よくある字下げのスタイルは,
c-continued-statement-offset
の値を0にしたものです.
c-brace-offset
は,開き中かっこで始まる行に加えられる字下げです.
その標準値は0です.
if (x == y) {
と
if (x == y) do_it ();
を比べてください.
c-brace-offset
が4なら,最初の例は
if (x == y) {
となるでしょう.
c-argdecl-indent
はCの関数の引数宣言の字下げを決めます.これは絶
対値です.引数宣言は,c-argdelc-indent
分の空白を取ります.標準値
は5で,次のようになります.
char * index (string, char) char *string; int char;
c-label-offset
は,ラベル,case文,default:
文を含む行に加
えられる字下げです.その標準値は-2です.次のようになります.
switch (c) { case 'x':
c-label-offset
が0なら,同じコードが次のように字下げされます.
switch (c) { case 'x':
この例では,他の変数は標準値に設定されているものとします.
これらの変数を標準に設定して,独立した行に開き中かっこを置き,字下げの スタイルをいろいろ試してみることをおすすめします.どのようになるかはGNU EmacsのCのソースファイルの字下げスタイルを見ればわかります.