indent input-file [ output-file ] [ [ -bap | -nbap ] [ -bacc | -nbacc ] [ -bad | -nbad ] [ -bbb | -nbbb ] [ -bc | -nbc ] [ -bl ] [ -br ] [ -bs | -nbs ] [ -cn ] [ -cdn ] [ -cdb | -ncdb ] [ -ce | -nce ] [ -cin ] [ -clin ] [ -dn ] [ -din ] [ -dj | -ndj ] [ -eei | -neei ] [ -ei | -nei ] [ -fc1 | -nfc1 ] [ -in ] [ -ip | -nip ] [ -ln ] [ -lcn ] [ -lp | -nlp ] [ -pcs | -npcs ] [ -npro ] [ -psl | -npsl ] [ -sc | -nsc ] [ -sob | -nsob ] [ -st ] [ -T typename ] [ -troff ] [ -v | -nv ]
indent は、C プログラムのフォーマッタです。input-file に含まれる C プログラムをスイッチに従って書式化し直します。指定できるスイッチについては後述します。これらは、ファイル名の前でも後ろでも指定できます。
注: input-file だけを指定すると、書式化は「インプレース」で行われます。つまり、書式化されたファイルが input-file に書き戻され、input-file のバックアップコピーが現在のディレクトリに書き込まれます。input-file の名前が /blah/blah/file のとき、バックアップファイルの名前は file.BAK となります。
output-file を指定すると、indent はそのファイルが input-file と異なるかどうかをチェックします。
次に示すオプションは、indent によって強制される書式を制御します。
-bacc を指定すると、各条件付きコンパイルブロックの前後に空白行が挿入されます。たとえば、各 #ifdef の前、および各 #endif の後ろです。これらの前後にあるほかの空白行は削除されます。デフォルト: -nbacc。
-bad を指定すると、各宣言ブロックの後ろに空白行が挿入されます。デフォルト: -nbad。
-bap を指定すると、各手続きの本体の後ろに空白行が挿入されます。デフォルト: -nbap。
-bbb を指定すると、各ブロックコメントの前に空白行が挿入されます。デフォルト: -nbbb。
-bc を指定すると、宣言の各コンマの後ろに改行が挿入されます。-nbc を指定すると、このオプションはオフになります。デフォルト: -bc。
-bl を指定すると、複合文が次のように並べられます。
if (...) { code }
-br (デフォルト) を指定すると、次のようになります。
if (...) { code }
sizeof の後ろへの空白の挿入を有効 (無効) にします。sizeof を手続き呼び出しのように表示するべきと考えるユーザーもいれば (-nbs、デフォルト)、sizeof は演算子なので、常にそのように扱って後ろに空白を置くべきと考えるユーザーもいます。
コードのコメントを開始するカラム。デフォルトは -c33 です。
宣言のコメントを開始するカラム。デフォルトでは、コードのコメントと同じカラムから開始されます。
空白行へのコメント区切り文字の挿入を有効 (無効) にします。このオプションを有効にすると、コメントは次のようになります。
/* * this is a comment */
次のようにはなりません。
/* this is a comment */
これはブロックコメントだけに影響し、コードの右側にあるコメントには影響を与えません。デフォルト: -cdb。
else を直前の「}」に寄せる処理を有効 (無効) にします。デフォルト: -ce。
継続行のインデントを値 n に設定します。継続行は、文の先頭行の先頭から値 n だけインデントされます。-lp が有効になっている場合を除き、括弧で囲まれた式には、入れ子を示すためにさらにインデントが追加されます。デフォルトでは、-ci は -i と同じ値になります。
case のラベルを、それを含んでいる switch 文から右へ、タブストップ n 個分インデントします。-cli0.5 とすると、case のラベルはタブストップの半分だけインデントされます。デフォルト: -cli0。
コードの右側にあるコメント以外のコメントの配置を制御します。デフォルトの -d1 では、そのようなコメントはコードの左へ 1 回インデントした位置に配置されます。-d0 を指定すると、このようなコメントはコードと同じ位置に配置されます。コメントのインデントに関する後述のセクションを参照してください。
宣言のキーワードからそれに続く識別子までのインデントを文字位置で指定します。デフォルト: -di16。
-dj を指定すると、宣言が左揃えされます。-ndj を指定すると、宣言はコードと同じ位置にインデントされます。デフォルト: -ndj。
-ei を有効にすると、else に続く if は、その前の if 文と同じ位置にインデントされます。無効にすると、else に続く if は、1 レベル深くインデントされます。デフォルト: -ei。
-eei を指定すると、if() および while() の式の部分の継続行に、1 レベル深い式のインデントが適用されます。このような継続行は、1 レベル深く (1 回ではなく 2 回) インデントされます。これは、継続が行われた式と、if() または while() に続く文とを間違えないようにするためのものです。デフォルト: -neei。
カラム 1 から始まるコメントの書式化を有効 (無効) にします。先頭の「/」がカラム 1 にあるコメントは、多くの場合、プログラマが 1 つ 1 つ手作業で書式化したものです。このような場合は、-nfc1 を使用するようにしてください。デフォルト: -fc1。
1 インデントレベルのスペースの数。デフォルトは、タブストップ 1 個分の -i8 です。
左マージンからのパラメータ宣言のインデントを有効 (無効) にします。デフォルト: -ip。
後ろのコメントを含む出力行の最大の長さ。デフォルト: -l78。
ブロックコメントの行の長さを n に設定します。デフォルトでは、-l で指定された通常の行の長さと等しくなります。
継続行の中で括弧に囲まれているコードの位置がそろえられます。ある行に、その行では閉じていない左括弧がある場合、継続行は左括弧の直後の文字位置から開始されます。たとえば、-nlp が有効な場合の継続コードの一部を示します。
p1 = first_procedure(second_procedure(p2, p3), third_procedure(p4, p5));
-lp が有効な場合 (デフォルト)、コードは次のようによりはっきりします。
p1 = first_procedure(second_procedure(p2, p3), third_procedure(p4, p5));
さらに 2 つの復帰改行文字を挿入すると、次のようになります。
p1 = first_procedure(second_procedure(p2, p3), third_procedure(p4, p5));
この例は -lp によって生成されたものです。
プロファイルファイル ./.indent.pro および ~/.indent.pro を無視します。
true (-pcs) の場合、ソースコード内のすべての手続き呼び出しと手続きの宣言において、手続き名と「(」の間にスペースが挿入されます。デフォルト: -npcs。
true (-psl) の場合、定義される手続きの名前がカラム 1 に置かれ、その型があれば、型は前の行に置かれたままとなります。デフォルト: -psl。
すべてのコメントの左端にアスタリスク (「*」) を挿入する処理を有効 (無効) にします。デフォルト: -sc。
-sob を指定すると、インデント時にオプションの空白行が削除されます。これを使用すれば、宣言の後ろの空白行を削除できます。デフォルト: -nsob。
indent は、標準入力から入力を読み取り、出力を標準出力に書き込みます。
型のキーワードのリストに typename を追加します。-T は複数回指定することができ、名前は累積されます。typedef で定義した、プログラム内のすべての型名を指定する必要があります。いくつかの型名を指定し忘れてもプログラムが壊されることはありませんが、書式化が適切でない部分が残ります。これは手間のかかることに思えますが、実際に C の問題の症状です。つまり、typedef により言語の構文が変更されますが、indent はすべての typedef を検出できるわけではありません。
troff で処理できるように indent でプログラムを書式化します。これにより、vgrind と同様の装飾されたリストが得られます。出力ファイルが指定されていない場合、デフォルトでは標準出力に出力され、インプレースでの書式化は行われません。通常、troff によって処理した出力を得るには、次のコマンドを使用します。
indent -troff program.c | troff -mindent
-v は「冗長」モードをオンにし、-nv はオフにします。冗長モードのとき、indent は 1 行の入力を 2 行以上の出力に分割した場合にそのことを報告し、コンパイル時にサイズの統計情報を示します。デフォルト: -nv。
ログインディレクトリまたは現在のディレクトリに .indent.pro というファイルを作成することにより、indent のデフォルトを決定する独自の「プロファイル」を設定できます。現在のディレクトリにある .indent.pro は、ログインディレクトリにあるものより優先されます。indent の実行時にプロファイルファイルが存在している場合は、それが読み込まれ、プログラムのデフォルトが設定されます。ただし、コマンド行のスイッチはプロファイルのスイッチを常にオーバーライドします。スイッチは、スペース、タブ、または復帰改行文字で区切ってください。
indent は、コメントの開始直後にダッシュまたはアスタリスクがある場合 (すなわち「/*-」または「/**」)、そのコメントがアスタリスクの枠によって囲まれていると想定します。そのようなコメントを構成する各行は、変更しないでそのままにします。ただし、コメントの先頭行のインデント位置が変更された場合は、その位置に合わせてインデントの位置を調整します。
その他のコメントはすべて一般テキストとして扱われます。indent は、各行にできるだけ多くのワードを (スペース、タブ、または復帰改行文字で区切って) 配置します。段落は空白行で区切られます。
コメントと同じ行にコードがある場合、そのコメントは「コメントカラム」から開始されます (コメントカラムはコマンド行パラメータ -cn によって設定されます)。それ以外の場合は、現在のコードのインデント位置よりも n レベルだけ少ない位置からコメントが開始されます (n はコマンド行パラメータ -dn によって指定されます)。コードがコメントカラムの位置を超えた場合、コメントはその位置よりも右側から開始され、極端な場合は、右マージンが自動的に拡張されることがあります。
通常、indent はプリプロセッサ行を変更しません。後ろに続くコメントの位置をそろえるだけです。埋め込まれているコメントは変更しません。indent は条件付きコンパイル (#ifdef...#endif) を認識し、構文的に特異な部分があると、それを補正しようとします。
indent は、C の構文の大部分を識別しますが、その解析は「甘い」ものです。構文が不完全であったり、正しくなかったりした場合、それが通常のものであれば対処しようとします。特に、次のようなマクロの場合:
#define forever for(;;)
正しく処理されます。
これらの 2 つのコメントの間にあるテキストはすべてそのまま残されます。したがって、ソースコードをこれらのコメントの間に置くと、書式変更の影響を受けません。
プロファイルファイル
プロファイルファイル
troff(1)
面倒な状況を招くことの多い、よくある誤りの 1 つを次に示します。
indent *.c
ディレクトリ内のすべての C プログラムに対して indent を実行しようとして、シェルでこのように入力してしまうことです。