※ このindent
2.2.9のマニュアルは既存の
こちらの
GNU indent v1.3 の邦訳を元に
足りない部分を翻訳ソフトにかけて適当に(意味不明でも)でっちあげたもんです。
[Top] | [Contents] | [Index] | [ ? ] |
indent
: Cプログラムソースのインデント&整形
indent
プログラムは、空白の挿入や削除を行い、C 言語プログラムの見栄えを変える。
これは indent
バージョン 2.2.9 用の「The indent
Manual」の
2.2.9.(2002年11月10日)版である。
1. indent
プログラムA. オプション要約 索引
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
indent
プログラム
indent
プログラムを使うとコードを読みやすくすることができる。また、
C 言語のコード記述を、あるスタイルから別のスタイルに変換することもでき
る。
indent
はたくさんある C 言語の文法を理解するが、文法が不完全な部分や
誤っている部分もできるだけ処理しようとする。
バージョン 1.2 以降では、GNU スタイルのインデントがデフォルトである。
1.1 indent
の起動1.2 バックアップファイル 1.3 一般的なスタイル 1.4 空行 1.5 コメント 1.6 文 1.7 宣言 1.8 インデント付け 1.9 長い行の分割 1.10 整形の抑止 1.11 様々なオプション 1.12 バグ 1.13 コピーライト
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
indent
の起動
バージョン 1.3 からはindent
コマンドのフォーマットは以下のようになっている:
indent [options] [input-files] indent [options] [single-input-file] [-o output-file] |
このフォーマットは古いバージョンや他バージョンの indent
と異なる。
最初の形式では 1 つ以上の入力ファイルを指定する。indent
は、各ファイ
ルのバックアップコピーを作成してから、オリジナルのファイルをインデント
付けしたものに置き換える。バックアップの作り方については、
「1.2 バックアップファイル」
セクションを参照のこと。
2 番目の形式では入力ファイルを 1 つだけ指定する。この場合、または標準 入力を使う場合には、‘-o’オプションの後に出力ファイルを指定することが できる。
indent
に標準出力へ出力させるには ‘-st’オプションを使う。
これが許されるのは、入力ファイルが 1 つだけの場合か、標準入力を使う場合だけで
ある。
入力ファイルを指定しなければ入力は標準入力から読み込まれる。 また、‘-’というファイル名が指定された場合にも 標準入力が読み込まれる。
使用例としては、以下のコマンドはいずれもプログラム ‘slithy_toves.c’ を 読み込み、インデント付けしたテキストを ‘slithy_toves.out’ に書き込む:
indent slithy_toves.c -o slithy_toves.out indent -st slithy_toves.c > slithy_toves.out cat slithy_toves.c | indent -o slithy_toves.out |
indent
の他のオプションのほとんどは、プログラムをどのように整形する
かを制御するためのものである。バージョン 1.2 からは、indent
は各オプ
ション名として長い名前も認識する。長いオプションの前には
‘--’ か ‘+’
が置かれる。
(1)
このドキュメントの大半では簡潔さのために従来の短い名前を使用している。
短い名前と長い名前の対応については
「A.オプション要約」セクションのリストを参照のこと。
別の使用例を挙げる:
indent -br test/metabolism.c -l85 |
これにより、プログラム ‘test/metabolism.c’ が ‘-br’ オプションと ‘-l85’ オプションを用いてインデント付けされ、その出力が ‘test/metabolism.c’ に重ね書きされ、元の ‘test/metabolism.c’ の内容は ‘test’ ディレクトリにバックアップファイルとして書き込まれる。
この例と同じ指定を長いオプション名を用いて行うと以下のようになる:
indent --braces-on-if-line --line-length185 test/metabolism.c indent +braces-on-if-line +line-length185 test/metabolism.c |
同じオプションを頻繁に使うならば、これらを ‘.indent.pro’ というファイル
に書いておくとよい。indent
はまず、カレントディレクトリで
‘.indent.pro’ を探し、見つかった場合にはこれを使用する。見つからなけれ
ば、indent
はホームディレクトリの ‘.indent.pro’ を探し、見つかった場
合にはこれを使用する。この動作は従来のバージョンや別バージョンの
indent
と異なる。これらは、両方のディレクトリに ‘.indent.pro’ ファイ
ルがあれば両方とも使用する。
‘.indent.pro’の書式は、コマンドラインでの指定と同様に 空白(タブ,スペース,改行)で区切られた単なるオプションの羅列である。 ‘.indent.pro’中でC/C++ 形式のコメントで囲むとオプションは無視される。
コマンドラインオプションが処理されるのは、‘.indent.pro’ を処理した
後 である。後から指定したオプションは、前に指定した引き数を上書きす
る。これには例外が 1 つある: 明示的に指定したオプションは暗黙のオプショ
ンを必ず上書きする(「1.3 一般的なスタイル」を参照)。
‘-npro’ オプションを指定することにより、
indent
が ‘.indent.pro’ ファイルを読み込まないようにすることができる。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
バージョン 1.3 からは、GNU indent
は GNU 形式、すなわち GNU Emacs と
同様の方法でバックアップファイルを作成する。つまり、単純なバックアッ
プファイルと番号付きのバックアップファイルをどちらも作成できる。
単純なバックアップファイルの名前は、元のファイル名にサフィックスを追加 して生成される。このサフィックスのデフォルト値は、1 文字からなる文字列 ‘~’(チルダ)である。したがって、‘python.c’ のバックアップファイルは ‘python.c~’ となる。
環境変数 ‘SIMPLE_BACKUP_SUFFIX’ に好きな文字列を好きな文字列を設定する ことにより、デフォルト値以外の任意の文字列をサフィックスとして使用でき る。
ファイル ‘momewraths.c’ の番号付きバックアップは、‘momewraths.c.~23~’ の
ようになる。ここで、23 はこのファイルのバックアップのバージョンである。
ファイル ‘src/momewrath.c’ のバックアップを作成するとき、バックアップ
ファイルの名前は ‘src/momewrath.c.~V~’ のようになる。ここで、V
はディレクトリ ‘src’ に現在ある最も大きいバージョンより 1 大きい数字である。
環境変数‘VERSION_WIDTH’は、必要に応じて0パティングし数字の桁(カラム)数を制御する。
例えばこの変数に"2"が設定されている場合、
バックアップファイル名は‘momeraths.c.~04~’となる。
どちらの方法でバックアップファイルを作るかは、環境変数‘VERSION_CONTROL’で制御する。
この文字列が ‘simple’ ならば、単純なバックアップだけが作成される。
‘numbered’ならば、番号付きバックアップとなる。
‘numbered-existing’ ならば、インデント付けする
ファイルの番号付きのバックアップが既にある場合に番号付き
バックアップが作成される。
それ以外の場合には、単純なバックアップが作成される。
‘VERSION_CONTROL’ が設定されていなければ、indent
は
‘numbered-existing’ が指定されているものとして動作する。
別バージョンの indent
は、サフィックス ‘.bak’ を使ってバックアップファ
イルの名前を生成する。この動作は、‘SIMPLE_BACKUP_SUFFIX’ に ‘.bak’ を
設定することによりエミュレートすることができる。
別バージョンの indent
は、現在の GNU indent
が行うようにソースファ
イルがあるディレクトリにバックアップを作成するのではなく、カレントディ
レクトリにバックアップを作成する点にも注意すること。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
C 言語には一般的なスタイルがいくつかある。例えば、GNU スタイル、 Kernighan & Ritchie スタイル、オリジナルの Berkeley スタイル等である。 スタイルはバックグラウンドオプション 1 つを使って選択することがで きる。このオプションは、他のオプション全ての値を指定する。ただし、明示 的に指定したオプションは、暗黙的に指定されたオプションよりも必ず優先さ れる。
バージョン 1.2 からは、GNU indent
のデフォルトのスタイルは GNU スタ
イルである。したがって、このフォーマットで出力するために ‘-gnu’ オプショ
ンを指定する必要はなくなった。ただし、このオプションを指定してもエラー
にはならない。GNU スタイルに対応するオプション設定は以下である:
-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -nprs -psl -saf -sai -saw -nsc -nsob |
GNU コーディングスタイルは GNU プロジェクトで推奨されている。これは GNU Emacs の C モードが適用しようとするスタイルであり、GNU Emacs の C で記述された部分で使われているスタイルである。(GNU プロジェクトのため にプログラムを書くことに興味がある方は、 「GNU コーディング規約 (The GNU Coding Standards)」 を入手されたい。 この文書では、メモリの使い方や整数のサイズ等、セマンティックや移植性につ いても説明されている。)
Kernighan & Ritchie スタイルは有名な書籍 「プログラミング言語 C (The C Programming Language)」 で使われている。 これは ‘-kr’ オプションで有効となる。Kernighan & Ritchie スタイルは、 以下のオプションの組合せと同等である:
-nbad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -nprs -npsl -saf -sai -saw -nsc -nsob -nss |
Kernighan & Ritchie スタイルでは、コードがある行の右の部分にコメントが
入れられることはない(コードの右に空白を 1 つだけ入れることもない)。し
たがって、このスタイルの桁(カラム)数 33 というのは indent
が勝手に決めた
ものである。
オリジナルの Berkeley 版 indent
のスタイルは、‘-orig’ (または長いオ
プション名 ‘--original’)を指定すれば得られる。このスタイルは、以下の設
定と同じ意味である:
-nbad -nbap -bbo -bc -br -brs -c33 -cd33 -cdb -ce -ci4 -cli0 -cp33 -di16 -fc1 -fca -hnl -i4 -ip4 -l75 -lp -npcs -nprs -psl -saf -sai -saw -sc -nsob -nss -ts8 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
各種プログラミングスタイルごとに、空白は異なる場所に置かれる。indent
には、特定の場所に空白行を挿入・削除するためのオプションがたくさんある。
‘-bad’ オプションを指定すると、indent
は宣言ブロック全ての後に必ず空
行を置く。‘-nbad’ オプションを指定すると、このような空白行は置かれない。
‘-bap’ オプションを指定すると、手続き本体全ての後に必ず空行が置かれる。 ‘-nbap’ オプションを指定すると、このような空行は置かれない。
‘-bbb’ オプションを指定すると、ブロックコメント全ての前に必ず空行が置
かれる。(「1.5 コメント」.を参照のこと)
‘-nbbb’ オプションを指定すると、このような空行は置かれない。
‘-sob’ を指定すると、indent
は省略できる空行を飲み込んでしまう
(つまり、入力行に含まれる省略できる空行が出力から全て削除される)。
‘-nsob’を指定すると、入力行に含まれる空行は出力ファイルにも全てコピーされる。
1.4.1 --blank-lines-after-declarations ‘-bad’オプションの詳細. 1.4.2 --blank-lines-after-procedures ‘-bap’オプションの詳細.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
‘-bad’ オプションを指定すると、宣言ブロックの後に必ず空行が置かれる。 ‘-nbad’ オプションを指定すると、このような空行は追加されない。
例えば、以下の入力を与えると
char *foo; char *bar; /* このコメントは宣言のブロックを分けている */ int baz; |
char *foo; char *bar; /* このコメントは宣言のブロックを分けている */ int baz; |
また‘indent -nbad’ の出力は以下のようになる。
char *foo; char *bar; /* このコメントは宣言のブロックを分けている */ int baz; |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
‘-bap’ オプションを指定すると、それぞれの宣言本体の後に必ず空行が置かれる。
例えば、以下の入力を与えると
int foo () { puts("Hi"); } /* 手続き bar には意味はない */ char * bar () { puts("Hello"); } |
‘indent -bap’ の出力は以下となる。
int foo () { puts ("Hi"); } /* 手続き bar には意味はない */ char * bar () { puts ("Hello"); } |
また、‘indent -nbap’ の出力は以下となる。
int foo () { puts ("Hi"); } /* 手続き bar には意味はない */ char * bar () { puts ("Hello"); } |
手続き ‘foo’ の後には空行は追加されない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
indent
はC/C++コメントを整形できる。
Cコメントは‘/*’で始まり‘*/’で終わるもので、
間に改行があってもかまわない。
C++ コメントは‘//’で始まり改行で終わる。
indent
はコメントの状況に応じた違いを扱う。
文に続くコメント、
宣言に続くコメント、
プリプロセッサ指令に続くコメント、
任意の種類のコードが先行しないコメントから始まる行(必ずしも1カラム目ではない)、
を識別しようとする。
indent
は、手続きや構造体等の外部で見つかったコメントと
内部で見つかったものとをさらに区別する。
手続き内で見つかったコメントから始まる行は、現在のコードと同じインデント位置に
インデントされる。
例外として、左端(1カラム目)から始まるコメントに関しては、その桁で出力される。
indent
は、箱型コメントを変更せずにすまそうとする。
そのようなコメントは一般的に、視覚的に区別するために
‘*’かダッシュで囲まれた長方形あるいは“箱”になっている。
より正確には、箱型コメントは‘/*’で始まり
‘*’か
‘=’,
‘_’,
‘-’
が続き、続く毎行コメントデリミタ(‘/*’)で始まるもの、あるいは開始デリミタの‘*’と
同じカラムに‘*’が先頭に置かれた行が連なるものと定義している。
箱型コメントの例:
/********************** * Comment in a box!! * **********************/ /* * A different kind of scent, * for a different kind of comment. */ |
indent
はソースファイルで見つかった通りに箱型コメントを正確に残そうとする。
したがって、コメントのインデントは変更されない。また、その長さはどのようにもチェックされない。
変更があるとすれば、埋め込まれたタブ文字が適切な数の空白に変換されるかもしれないということだろう。
‘-bbb’が指定されている場合、 コードが箱型コメントに先行しなければ 空行がすべての箱型コメントの前に挿入される。
箱型でないコメントは整形されるだろう。 右マージンを満たすため行を分割し左側は空白で埋めることになる。 単一の改行は空白と等価だが、空行(連続2つ以上の改行)はパラグラフの分離として扱う。 ‘-fca’オプションを用いれと最初のカラムより後に始まるコメントの整形できる。 最初のカラムから始まるコメントの整形には‘-fc1’を用いる。これらの指定は デフォルトでは無効になっている。
デフォルトで右マージンは78になっているが、‘-lc’オプションを用いれば変更できる。 指定されたマージンでコメント表示が出来ない場合、 そのコメントの間自動的にマージンは拡張されるだろう。 コメントが整形されない場合、マージンは無視される。
コメントが行頭あり(つまり左側にプログラム・テキストがなく)、 コードブロック内にないならば、 見つかったカラムでインデントされるだろう。 ブロック内ならば、そのようなコメントはブロック内のコードの インデントと同じになるだろう (ただしコメントが行の先頭カラムでないならば)。 ‘-d’オプションでコメントが左に移動するような指定がされたり 逆インデントされたりすると この位置合わせは影響をうけるかもしれない。 例えば‘-d2’はコードの左側にコメントと空白2個を置く。 デフォルトでは先頭カラムでないならば コメントはコードと同期する。先頭カラムだったならば デフォルトではその位置に残る。そのような場合も同期させたいならば ‘-fc1’を指定すること。
コードの右側のコメントはデフォルトでは33桁目から置かれる。 これは3つのオプションのうちいずれかで変更されるかもしれない。 ‘-c’を用いればコードに続くコメントのカラムを指定できる。 ‘-cd’を用いれば宣言に続くコメントのカラムを指定できる。 ‘-cp’を用いればプリプロセッサ指令#else,#endifに続く コメントのカラムを指定できる。
コメントの左側のコードが開始カラムを超過する場合は コードの終了あるいはプリプロセッサ指令ならば指令の終了を過ぎて からの次のタブ・ストップ・カラムに コメント開始カラムを変更するだろう。 この拡張は、特にそのコメントの出力の間のみ続く。
‘-cdb’オプションを用いれば、ブランク行にコメント・デリミタを置く。
したがって/* Loving hug */
のような1行コメントは次のように変形できる:
/* Loving hug */ |
‘-sc’オプションを用いれば多重ライン・コメントの先頭に‘*’を 置くことができる。 したがって、1行コメントは次のように変形できるで(‘-cdb -sc’併用):
/* * Loving hug */ |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
‘-br’ または ‘-bl’ オプションは、ブレースをどのように整形するかを指定 する。
‘-br’ オプションを指定するとブレースは以下のように整形される:
if (x > 0) { x--; } |
‘-bl’ オプションを指定するとブレースは以下のように整形される:
if (x > 0) { x--; } |
‘-bl’ オプションを使う場合には ‘-bli’ オプションも使うとよい。このオ プションはブレースのインデント付けに使う空白の数を指定する。‘-bli2’(デ フォルト値)を指定すると、先に示した結果となる。‘-bli0’ を指定した場合 の結果は以下である:
if (x > 0) { x--; } |
‘-br’ オプションを使う場合には、多分 ‘-ce’ も使いたくなるだろう。この オプションは if-then-else 構文の ‘else’ を直前の ‘}’ に隣に置く。例え ば ‘-br -ce’ を指定すると、出力は以下のようになる:
if (x > 0) { x--; } else { fprintf (stderr, "...something wrong?\n"); } |
同じコードで ‘-br -nce’ を指定すると以下のようになる:
if (x > 0) { x--; } else { fprintf (stderr, "...something wrong?\n"); } |
これは do-while ループでの while の直前の‘}’にも影響する。 ‘-cdw’と併用した例は以下のようになる。
do { x--; } while (x); |
‘-ncdw’ なら次のようになる。
do { x--; } while (x); |
‘-cli’ オプションは、case 構文のラベルを ‘switch’ 文から右にインデント する際に空白をいくつ入れるかを指定する。
デフォルトなら下記のようになる:
switch (i) { case 0: break; case 1: { ++i; } default: break; } |
‘-cli2’ を使用した結果:
switch (i) { case 0: break; case 1: { ++i; } default: break; } |
‘-cbin’オプションを用いて case 文下のブレースの インデントを制御できる。 例えば‘-cli2 -cbi0’を使用した結果:
switch (i) { case 0: break; case 1: { ++i; } default: break; } |
セミコロンが ‘for’ または ‘while’ 文と同じ行にある場合に ‘-ss’ を指定 すると、空白がセミコロンの前に置かれる。これによりセミコロンが強調され、 ‘for’ や ‘while’ 文の本体が空の文であることがはっきりする。‘-nss’ を指 定すると、この機能は無効になる。
‘-pcs’ オプションを指定すると、呼び出される手続きの名前と ‘(’ の間に空 白が置かれる(例えば、‘puts ("Hi");’ となる。また、‘-npcs’ オプション を指定している場合には ‘puts("Hi");’ となる。)
‘-cs’ オプションを指定すると、indent
はキャスト演算子の後に空白を置く。
‘-bs’ オプションを指定すると、キーワード ‘sizeof’ とその引数の間に必 ず空白が置かれる。バージョンによっては、この機能は ‘Bill_Shannon’ オプ ションとして知られている。
‘-saf’オプションを指定すると for
と次の括弧との間に必ず空白が置かれる。
これはデフォルトである。
‘-sai’オプションを指定すると if
と次の括弧との間に必ず空白が置かれる。
これはデフォルトである。
‘-saw’オプションを指定すると while
と次の括弧との間に必ず空白が置かれる。
これはデフォルトである。
‘-prs’オプションを指定すると すべての括弧とその他との間に空白を置くようになる。 例えば‘-prs’を使った結果:
while ( ( e_code - s_code ) < ( dec_ind - 1 ) ) { set_buf_break ( bb_dec_ind ); *e_code++ = ’ ’; } |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
デフォルトでは、indent
は ‘-di’ オプションで指定したカラムで識別子を
揃える。例えば、‘-di16’ を指定すると以下のようになる:
int foo; char *bar; |
‘-di’ オプションに小さい値(1 や 2 など)を使うと、置くことが可能な最初 の場所に識別子を置くことができる。例を以下に示す:
int foo; char *bar; |
この場合でも、‘-di’ オプションに指定した値は型指定と異なる行に置いた変 数には影響を与える。例えば、‘-di2’ を指定すると以下のようになる:
int foo; |
‘-bc’ オプションを指定すると、宣言中のコンマの後に改行が置かれる。例を 以下に示す:
int a, b, c; |
同じコードで ‘-nbc’ オプションを指定した場合は以下のようになる:
int a, b, c; |
‘-bfda’オプションを指定すると、関数宣言引数の区切りのコンマの後で必ず改行する。 引数は関数宣言よりも1つ深くインデントされる。長い引数リスト持つ関数では特に有用だろう。 ‘-bfde’オプションを指定すると、関数宣言の終了ブラケットの手前で必ず改行する。 これらのオプションのデフォルト設定はどちらも'n'で、-nbdfa と -nbdfe となっている。
例えば、
void foo (int arg1, char arg2, int *arg3, long arg4, char arg5); |
void foo ( int arg1, char arg2, int *arg3, long arg4, char arg5); |
さらに‘-bfde’を付け加えると
void foo ( int arg1, char arg2, int *arg3, long arg4, char arg5 ); |
‘-psl’ オプションを指定すると、定義される手続きの型は手続きの名前の前 の行に置かれる。このスタイルは、‘etags’ プログラムや Emacs の ‘c-mode’ の一部の機能を正しく動作させるために必要である。
プログラム中で ‘typedef’ で定義された型名は全て、
‘-T’ オプションを使って indent
に教えてやる必要がある。
‘-T’ は複数個指定することができ、指定された全ての名前を使うことができる。
例えば、プログラムに
typedef unsigned long CODE_ADDR; typedef enum {red, blue, green} COLOR; |
という記述がある場合には、オプション ‘-T CODE_ADDR -T COLOR’ を使うこ とになるだろう。
‘-brs’と‘-bls’ オプションは struct 宣言でのブレースを
どうするかを指定する。
‘-brs’ オプションは以下のように整形する。
struct foo { int x; }; |
‘-bls’ オプションは以下のように整形する。
struct foo { int x; }; |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
コードを整形する時の問題の一つは、各行をどれだけ左端からインデントさせ るかである。‘if’ や ‘for’ 等の文の先頭部分があると、インデントの深さは ‘-i’ オプションで指定した値だけ増える。例えば、レベルごとに 8 文字分の インデントさせるには ‘-i8’ を使う。文が前の行から続いている場合には、 その部分は ‘-ci’ オプションで指定した追加のスペース分だけインデントさ れる。‘-ci’ のデフォルト値は 0 である。 しかし、‘-lp’ オプションが指定されており、かつ同じ行で閉じられていない 左括弧がある場合、その続きの行が始まる文字は左括弧の直後の位置に揃えら れる。この処理は ‘[’ および初期化リストに現われる ‘{’ にも適用される。 例えば、‘-nlp -ci3’ が有効になっていると、行をまたがるコードは以下のよ うになる:
p1 = first_procedure (second_procedure (p2, p3), third_procedure (p4, p5)); |
‘-lp’ を有効にすると、コードはいくらか見やすくなる:
p1 = first_procedure (second_procedure (p2, p3), third_procedure (p4, p5)); |
2つ以上の(...)括弧ペアのある文が分割されたとき、余分なペアのためインデントレベルは余分にインデントされる。
if ((((i < 2 && k > 0) || p == 0) && q == 1) || n = 0) |
‘-ipN’オプションは余分な括弧に対するオフセットを指定できる。 たとえば‘-ip0’は次のように整形するだろう:
if ((((i < 2 && k > 0) || p == 0) && q == 1) || n = 0) |
indent
はタブが入力と出力のストリームの両方で一定の間隔で置かれるこ
とを想定している。この間隔はデフォルトでは 8 カラム幅であるが、(バージョ
ン 1.2 からは)‘-ts’ オプションで変更することができる。タブは複数個の空
白と同じ意味である。
古い形式の関数定義における型宣言のインデント付けは、‘-ip’ パラメータで 制御できる。これは、型宣言では空白何個分のインデントを行うか を指定する数値パラメータである。例えばデフォルトの ‘-ip5’ では、定義は 以下のように整形される:
char * create_world (x, y, scale) int x; int y; float scale; { . . . } |
他のバージョンの indent
との互換性のためにオプション ‘-nip’ が用意され
ている。これは ‘-ip0’ と同じである。
ANSI Cではプリプロセッサ行の ‘#’と指令名との間に空白を置くことができる。
デフォルトは indent
はこの空白を削除するが、
‘-lps’オプションを指定すれば indent
がこの空白を削除するような修正をしなくなる。
‘-ppi’オプションは‘-nlps’や‘-lps’よりも優先される。
このオプションは一緒に指定された値をインデントの桁数としてプリプロセッサ条件文をインデントする。
例えば‘-ppi 3’を指定する場合
#if X #if Y #define Z 1 #else #define Z 0 #endif #endif |
#if X # if Y # define Z 1 # else # define Z 0 # endif #endif |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
-ln’または‘--line-lengthn’オプションで、 Cコードの最大桁数を(続くコメントを含まないで)指定できる。
指定された桁数よりも長くなるとき、GNU indent
は必然的な箇所で分割しようとする。
これは 2.1版で更新されたのだが、まだそれほど賢くないし柔軟でもない。
現在、2つのオプションがある。 1つは、どこで行を分割するかの判定を抑止する。
‘-bbo’オプションを用いると
GNU indent
は論理演算子 && や || の手前で行を分割しようとする。
‘-nbbo’オプションを用いるとそのような優先を行わない。
例えばデフォルトオプションの‘-bbo’
(と一緒に‘--line-length60’ と‘--ignore-newlines’も) の場合
以下のようなコードになる:
if (mask && ((mask[0] == ’\0’) || (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’))))) |
‘-nbbo’オプションを使用すると以下のようになるだろう:
if (mask && ((mask[0] == ’\0’) || (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’))))) |
‘-hnl’はデフォルトだが、行分割する場合なるべく優先的に 入力ファイルでの改行位置を用いるようにする。 例えば、入力ファイルが下記のような場合:
if (mask && ((mask[0] == ’\0’) || (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’))))) |
‘-hnl’あるいは‘--honour-newlines’を 既出の‘-nbbo’と‘--line-length60’と一緒に使用すると、 先の例とは違った出力になる。同じでない代わりに、入力ファイル中の改行位置と 同じ位置で行を分割しようとする:
if (mask && ((mask[0] == ’\0’) || (mask[1] == ’\0’ && ((mask[0] == ’0’) || (mask[0] == ’*’))))) |
このオプションは
長すぎる行があったとしてもすでに分割されているだろうから
GNU indent
は触らないほうがよいだろう、
という考えに基づいている。
本当に汚いコードなら
少なくとも一度‘--ignore-newlines’オプションでも使用してから
indent
を実行すべきだろう。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
プログラム中に特別のコントロール・コメントを埋め込むことにより Cプログラムコードの一部の整形を無効にできる。 プログラムセクションの整形を止めたい場合は、そのセクションの直前に 停止用コントロール・コメント /* *INDENT-OFF* */ のみの行を置く。 このコントロールコメント後のプログラムテキストは 対応する許可コメントのみの行が見つかるまで 入力を改変せずそのまま出力する。 許可用コントロール・コメントは /* *INDENT-ON* */ である。 このコメントの行の残りのテキストも未整形で出力される。 整形は許可用コントロール・コメントの次の入力行から再開する。
より正確には indent
はこれらのCコメントの閉デリミタ(‘*/’)の確認さえ行わない。
また、この行にあるどんな空白も感知しない。
さらにこれらのコントロール・コメントは C++フォーマット形式
(すなわち // *INDENT-OFF*
や // *INDENT-ON*
)
でも機能する。
注意すべきことはindent
の内部状態は未整形のセクションの間は変化しないということである。
例えば、関数の最中に整形を止め、そして関数が終わってから整形を再開すると
おかしな結果になるだろう。したがって未整形するコードの選択は多少モジュール的に選んだほうが
よいだろう。
歴史的な経緯として、indent
の初期バージョンのいくつかは *INDENT** で始まるエラーメッセージを生成していた。
これらのバージョンの indent
は、そのようなエラーメッセージで始まる入力テキスト行を無視するように作られていた。
GNU indent
では、この排他的な特徴は取り除かれた。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
使っている indent
のバージョンを知るには、コマンド ‘indent -version’
を用いること。これを用いると、通常の処理は全く行われず、indent
のバー
ジョン番号が表示される。
‘-v’ オプションを用いると、詳細表示モードを有効にすることができる。詳
細表示モードでは、indent
は 1 つの行を出力で複数行にする時には報告を
行い、実行終了時にサイズに関する情報を出力する。
‘-pmt’オプションを用いるとindent
は出力ファイルのアクセス修正時間を保持する。
このオプションの使用は、
運用中のプロジェクトでソースとヘッダファイルをすべてインデントしても
‘make’でターゲットのリビルドをさせたくないような場合に有用だ。
このオプションは、POSIXutime(2)
機能を持つオペレーティング・システムでのみ
利用可能である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
何かバグがあれば bug-indent@gnu.org へレポートしてほしい。
1つのファイルに対して2回 indent
を実行する場合、
そのファイルを同じプロファイルを用いて2回目の変換を行うべきでない。
indent
の現在の仕組みでは保証することができない。
また広範囲のテストも行われていない。
indent
は C を理解していない。
場合によっては無意味に行を繋げてしまう。
プロファイル(‘.indent.pro’)を備えたindent
の
実行結果だったとしても、変換された入力ファイルを元に戻すことはできない。
indent
を C++ 対応にする試みはあったが、
非常に単純な C++ソース以外には役に立たないだろう。
出力ファイルにコメントを出力するとき、indent
は
指定された‘--line-length’オプションを用いない。
しばしば右に遠く置かれるコメントのためだ。
行末にコメントがある分割された文を
indent
に連結させないようにするには
分割された行の最初にコメントを置く必要がある。
/* *INDENT-OFF* */
で無効にされる場合、
indent
は行およびコメント(‘-v’オプションを参照)をカウントしない。
/*UPPERCASE*/形式の(大文字のみの)コメントはコメントとして扱われず、
次の行にそれらをつなぐ識別子として扱われるが、
コードから始まる行に埋め込まれていなければ意味はない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
下記の著作権表示は indent
プログラムに対するものである。
このマニュアルの著作権および配布許諾は、‘indent.texinfo’や‘indent.info’の始めのほう、
および‘indent.1’の終わりのほうに書かれている。
Copyright © 2001 David Ingamells. Copyright © 1999 Carlo Wood. Copyright © 1995, 1996 Joseph Arceneaux. Copyright © 1989, 1992, 1993, 1994, 1995, 1996 Free Software Foundation Copyright © 1985 Sun Microsystems, Inc. Copyright © 1980 The Regents of the University of California. Copyright © 1976 Board of Trustees of the University of Illinois. All rights reserved. Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley, the University of Illinois, Urbana, and Sun Microsystems, Inc. The name of either University or Sun Microsystems may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED ‘‘AS IS’’ AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下に indent
の全てのオプションを示す。短い形のオプションをアルファ
ベット順で並べている。その後には、長い形式のオプションをアルファベット
順に並べた参照キーを示している。
for
の直後に空白を置かない。
if
の直後に空白を置かない。
while
の直後に空白を置かない。
indent
の起動 参照.
for
の直後に空白を置く。
if
の直後に空白を置く。
while
の直後に空白を置く。
indent
の起動 参照.
indent
に指定する。
indent
のバージョン番号を表示する。長い名前についてアルファベット順に並べたオプションのリストを示す。これ を使えば対応する短いオプション名が簡単に分かる。
--blank-lines-after-commas -bc --blank-lines-after-declarations -bad --blank-lines-after-procedures -bap --blank-lines-before-block-comments -bbb --braces-after-if-line -bl --brace-indent -bli --braces-after-struct-decl-line -bls --braces-on-if-line -br --braces-on-struct-decl-line -brs --break-after-boolean-operator -nbbo --break-before-boolean-operator -bbo --break-function-decl-args -bfda --break-function-decl-args-end -bfde --case-indentation -clin --case-brace-indentation -cbin --comment-delimiters-on-blank-lines -cdb --comment-indentation -cn --continuation-indentation -cin --continue-at-parentheses -lp --cuddle-do-while -cdw --cuddle-else -ce --declaration-comment-column -cdn --declaration-indentation -din --dont-break-function-decl-args -nbfda --dont-break-function-decl-args-end -nbfde --dont-break-procedure-type -npsl --dont-cuddle-do-while -ncdw --dont-cuddle-else -nce --dont-format-comments -nfca --dont-format-first-column-comments -nfc1 --dont-line-up-parentheses -nlp --dont-space-special-semicolon -nss --dont-star-comments -nsc --else-endif-column -cpn --format-all-comments -fca --format-first-column-comments -fc1 --gnu-style -gnu --honour-newlines -hnl --ignore-newlines -nhnl --ignore-profile -npro --indent-level -in --k-and-r-style -kr --leave-optional-blank-lines -nsob --leave-preprocessor-space -lps --line-comments-indentation -dn --line-length -ln --no-blank-lines-after-commas -nbc --no-blank-lines-after-declarations -nbad --no-blank-lines-after-procedures -nbap --no-blank-lines-before-block-comments -nbbb --no-comment-delimiters-on-blank-lines -ncdb --no-space-after-casts -ncs --no-parameter-indentation -nip --no-space-after-for -nsaf --no-space-after-function-call-names -npcs --no-space-after-if -nsai --no-space-after-parentheses -nprs --no-space-after-while -nsaw --no-tabs -nut --no-verbosity -nv --original -orig --parameter-indentation -ipn --paren-indentation -pin --preserve-mtime -pmt --procnames-start-lines -psl --space-after-cast -cs --space-after-for -saf --space-after-if -sai --space-after-parentheses -prs --space-after-procedure-calls -pcs --space-after-while -saw --space-special-semicolon -ss --standard-output -st --start-left-side-of-comments -sc --struct-brace-indentation -sbin --swallow-optional-blank-lines -sob --tab-size -tsn --use-tabs -ut --verbose -v |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Jump to: | -
.
B C E G I K L O S T U |
---|
Jump to: | -
.
B C E G I K L O S T U |
---|
[Top] | [Contents] | [Index] | [ ? ] |
POSIX標準に準拠するため、‘+’は‘--’に置き換えらた。
[Top] | [Contents] | [Index] | [ ? ] |
1.indent
プログラム
1.1A. オプション要約indent
の起動
1.2 バックアップファイル
1.3 一般的なスタイル
1.4 空行
1.4.1 --blank-lines-after-declarations1.5 コメント
1.4.2 --blank-lines-after-procedures
1.6 文
1.7 宣言
1.8 インデント付け
1.9 長い行の分割
1.10 整形の抑止
1.11 様々なオプション
1.12 バグ
1.13 コピーライト
索引
[Top] | [Contents] | [Index] | [ ? ] |
1.indent
プログラム
A. オプション要約
索引
[Top] | [Contents] | [Index] | [ ? ] |
Button | Name | Go to | From 1.2.3 go to |
---|---|---|---|
[ < ] | Back | previous section in reading order | 1.2.2 |
[ > ] | Forward | next section in reading order | 1.2.4 |
[ << ] | FastBack | previous or up-and-previous section | 1.1 |
[ Up ] | Up | up section | 1.2 |
[ >> ] | FastForward | next or up-and-next section | 1.3 |
[Top] | Top | cover (top) of document | |
[Contents] | Contents | table of contents | |
[Index] | Index | concept index | |
[ ? ] | About | this page |