Go to the first, previous, next, last section, table of contents.

Cの字下げのカスタム化

2つの変数でどのコマンドがいつCの字下げを行なうかを制御します.

c-auto-newlineがnon-nilなら,挿入した中かっこ`{'の 前後,コロンとセミコロンの後ろで改行されます.このようにして作られたすべ ての行についてCの字下げを調整します.

c-tab-always-indentnilなら,CモードでのTABコマン ドは,ポイントが左端か,左の字下げの空白の中にあるときだけ字下げを行ない ます.ポイントの左に空白でない文字があるときは,TABはタブ文字をバッ ファに挿入します.通常この変数の値はtTABはつねに現在行の 字下げをやり直します.

Cには,特殊な形の字下げをする特別な関数名といったものはありません.し かしCには違った意味でのカスタム化の機能が必要です.多くの異なったスタイ ルの字下げが一般に使われています.

Emacsでは6つの変数を設定して,Cモードで扱うCのスタイルを制御します.

c-indent-level
ブロック内のCの文の字下げを指定します.周囲のブロックの字下げとは開き中 かっこのある行の字下げをいいます.
c-continued-statement-offset
if文のthen節やwhile文の本体のように,文の中で始まる文に加える字下げの数 を指定します.
c-brace-offset
開き中かっこで始まる行に加える字下げの数を指定します.
c-brace-imaginary-offset
他のテキストの後ろにある開き中かっこが,この行の先頭からどれだけ右にある と考えるかを指定します.
c-argdecl-indent
Cの関数の引数宣言の字下げを指定します.
c-label-offset
ラベルやcase,defaultのある文に加える字下げの数を指定します.

変数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-offsetc-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のソースファイルの字下げスタイルを見ればわかります.


Go to the first, previous, next, last section, table of contents.