EN JA
INDENT(1)
INDENT(1) FreeBSD General Commands Manual INDENT(1)

名称

indentC 言語プログラムの字下げと整形

書式

indent [ input-file [ output-file]][ -bacc | -nbacc][ -bad | -nbad][ -bap | -nbap][ -ei |  -ei][ -eei |  -eei][ -bbb |  -nbbb][ -bc | -nbc][ -bl][ -br][ -cn][ -cdn][ -cdb |  -ncdb][ -ce | -nce][ -cin][ -clin][ -dn][ -din][ -fbs |  -nfbs][ -fc1 |  -nfc1][ -fcb |  -nfcb][ -in][ -ip | -nip][ -ln][ -lcn][ -ldin][ -lp | -nlp][ -npro][ -pcs | -npcs][ -psl | -npsl][ -sc | -nsc][ -sob |  -nsob][ -st][ -ta][ -troff][ -ut | -nut][ -v | -nv]

解説

indent ユーティリティは、 C 言語プログラムの整形を行います。 input-file 中の C プログラムをオプションに従って整形し直します。以下で説明するオプションは、ファイル名の前後で指定できます。

: input-file のみを指定した場合、整形は、「同じ場所に」行われます。つまり、整形結果は、 input-file に書き戻され、カレントディレクトリに元の input-file のバックアップがコピーされます。例えば input-file の名前が‘ /blah/blah/file’だったとすると、バックアップファイルの名前は、‘ file.BAK’となります。

indent は、 output-file が指定されると、念のため、それが input-file とは異なっていることをチェックします。

indent の整形スタイルは、以下にあげるオプションで制御します。

-bacc, -nbacc
-bacc が指定されるなら、空行は、すべての条件付きコンパイルブロックのまわりで強制されます。例えば、すべての #ifdef の前とすべての #endif の後です。そのようなブロックを囲む他の空行は、吸収されます。デフォルト: -nbacc
-bad, -nbad
-bad を指定すると、宣言ブロックの後ごとに空行を 1 行入れます。デフォルトは、 -nbad です。
-bap, -nbap
-bap を指定すると、関数本体の後ごとに空行を 1 行入れます。デフォルトは、 -nbap です。
-bbb, -nbbb
-bbb を指定すると、コメントブロックの前に必ず空行を 1 行入れます。デフォルトは、 -nbbb です。
-bc, -nbc
-bc を指定すると、宣言の中のコンマの後ごとに改行を入れます。 -nbc は、これを抑止します。デフォルトは、 -nbc です。
-br, -bl
-bl を指定すると、複合文は、以下のように行分けされます。

if (...) 
{ 
  code 
}

一方、デフォルトは、 -br ですが、以下のようになります。

if (...) { 
  code 
}
-c n
プログラムコードの右側に書かれたコメントの開始位置を指定します。デフォルトでは、33 桁目です。
-cd n
宣言の右側に書かれたコメントの開始位置を指定します。デフォルトでは、プログラムコードの右側に書かれたコメントと同じ位置になります。
-cdb, -ncdb
コメント区切りを独立の行とするかどうかを指定します。このオプションを有効にすると、コメントは、以下のようになります:

 /* 
  * this is a comment 
  */

一方、このオプションが有効でなければ、以下のようになります:

 /* this is a comment */

このオプションは、ブロックコメントのみに影響し、コード右側のコメントには影響しません。デフォルトは、 -cdb です。

-ce, -nce
`else' を直前の `}' につけて ``} else'' のように出力します。デフォルトは、 -ce です。
-ci n
継続行の字下げを n で指定します。継続行は、その文の最初の行の先頭から指定した字数だけ字下げされます。 -lp が有効でなければ、または、継続行の字下げがメインの字下げのちょうど半分でないならば、かっこで括られた式は、入れ子になっていることを示すために余分に字下げされます。 -ci のデフォルトは、 -i と同じ値です。
-cli n
case ラベル字下げ位置を switch 文の字下げ位置から n 個目のタブストップにします。 -cli0.5 なら、タブストップの半分になります。デフォルトは、 -cli0 です。
-d n
プログラムコードの右側に書かれたものでない独立したコメントに関して、その場所を制御します。例えば -d1 で、コードの字下げより 1 段左側にします。デフォルトの -d0 を指定すると、プログラムコードの字下げに合わせます。下記「コメントの字下げ」の節を参照して下さい。
-di n
大域変数名と全ての構造体 / 共用体のメンバ名の、それらの型宣言の開始位置からの字下げを文字数で指定します。デフォルトは、 -di16 です。
-dj, -ndj
-dj は、宣言を左揃えにします。 -ndj は、プログラムコードと同じ字下げを行います。デフォルトは、 -ndj です。
-ei, -nei
else-if に対し特別な処理をするよう指定します (しません)。これを指定すると、 else に続く if は、最初の if 文と同じだけ字下げされます。 -ei がデフォルトです。
-eei, -neei
ifwhile 文の式の部分の継続行で特別の字下げを有効 (無効) にしますこれらの継続行は、1 つの特別のレベルに字下げされます。デフォルトは、 -neei です。
-fbs, -nfbs
関数宣言と開き中括弧を 2 行に分けるよう指定します (しません)。デフォルトは、 -fbs です。
-fc1, -nfc1
コメントが 1 桁目から始まっている場合も整形します (しません)。プログラマが意図的にそうしている場合がありますから、そのような場合に、 -nfc1 を使うべきではありません。デフォルトは、 -fc1 です。
-fcb, -nfcb
ブロックコメント (`/*\n' で開始するコメント) の整形を有効とするかどうかを指定します。プログラマは、ブロックコメントをそれ程は注意深く手動整形していないことが多いですが、再整形によって改行位置だけを変えるということは望ましくないことがあります。このような場合には、 -nfcb を使います。ブロックコメントは、ボックスコメントのように扱われます。デフォルトは、 -fcb です。
-i n
1 段の字下げ量を指定します。デフォルトは、8 文字です。
-ip, -nip
パラメータ宣言を左マージンからさらに字下げします (しません)。デフォルトは、 -ip です。
-l n
出力行の最大幅を指定します。デフォルトは、78 文字です。
-ldi n
局所変数の、その型宣言の開始位置からの字下げを文字数で指定します。局所変数名のデフォルトは、大域変数の値と同じだけの字下げです。
-lp, -nlp
継続行において括弧内のプログラムコードの位置を揃えます。左括弧がその行で閉じていない時、継続行を前の行の左括弧の 1 文字後ろから始まるようにします。例えば、 -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));
-npro
字下げのプロファイル‘ ./.indent.pro’と‘ ~/.indent.pro’を使わないようになります。
-pcs, -npcs
真 ( -pcs) ならば、全ての関数呼出しの関数名と括弧の間に空白を 1 つ入れます。デフォルトは、 -npcs です。
-psl, -npsl
真 ( -psl) ならば、関数定義における関数の名前を 1 桁目から始めます。つまり、その関数の型名は、前の行に置かれることになります。デフォルトは、 -psl です。
-sc, -nsc
全てのコメントの左端に、アスタリスク (`*') を置きます (置きません)。デフォルトは、 -sc です。
-sob, -nsob
-sob が指定されると、不要な空白行を取除きます。宣言部の後ろの余分な空白行を取り除くのに便利です。デフォルトは、 -nsob です。
-st
indent が標準入力に対して処理を行い、結果を標準出力に出力するようします。
-ta
タイプキーワードのリストにすべての識別子の終りを示す "_t"を自動的に追加します。
-T typename
typename を型名として扱うように追加します。 -T は、幾つ使ってもかまわないので、複数の型名を指定できます。プログラム中で typedef によって定義された型名は、必ず指定する必要があります。-多少の指定を忘れたところで実害は、全くありませんが、プログラムは、意図した程きれいには、整形されないでしょう。全部の型名を指定しなければならないのは、大変なように思えますが、実際には、これは、C 言語のもつ問題が表面化したに過ぎません。つまり、 typedef は、言語の構文解釈を変えてしまうので、 indent は、 typedef で定義された型名を全て見つけることができないわけです。
-troff
indent は、 troff(1) で処理できるフォーマットで出力します。 vgrind(1) と全く同じ考え方に基づいて、出力をきれいにしようとします。出力ファイルが指定されていないと、出力先として入力ファイルではなく標準出力が使われます。
-ut, -nut
出力におけてタブ文字を使用するよう指定します (しません)。タブは、8 で割り切れるカラムで整列されると想定します。デフォルトは、 -ut です。
-v, -nv
-v で `verbose' モードになります。 -nv は、`verbose' モードを抑止します。 `verbose' モードでは、 indent は、入力中の 1 行が複数行に分割された場合には、その旨を表示し、終了時には、出力サイズについての情報を付け加えるようになります。デフォルトは、 -nv です。

ログインディレクトリかカレントディレクトリの一方、あるいはその両方に .indent.pro というプロファイルを作って、その中にオプションを書いておくことにより、あなたの好みの設定を indent のデフォルトとすることができます。プロファイルは、ログインディレクトリ、カレントディレクトリの順で読み込まれるため、カレントディレクトリに `.indent.pro'があると、そちらの指定の方が優先されます。 indent の起動時にプロファイルが存在していると、それを読み込んでデフォルトとして使用します。ただし、コマンド行でオプションを指定すると、それは、常にプロファイル中のオプションよりも優先されます。プロファイルを書く際には、各オプションを空白かタブもしくは改行で区切ってやらなくてはなりません。

コメント

ボックスコメント の処理について説明します。 indent ユーティリティは、コメント開始の直後にマイナスやアスタリスクが続いている (つまり `/*-' もしくは `/**' となっている) 場合、そのコメントをアスタリスクで周囲を囲まれたものとみなします。このようなコメントに対しては、コメントの最初の行に施される字下げ位置に、続く各行を揃える他は、処理を行いません。

つぎに、 連続したテキスト としての処理について説明します。上にあげた以外のコメントは、連続したテキストとして扱います。 indent ユーティリティは、 1 行にできるだけ多くの単語 (空白やタブもしくは、改行で区切られた文字列) を詰め込もうとします。また、空白行により段落が分けられます。

コメントの字下げ

プログラムコードの右側のコメントは、コマンド行のオプション -c n で指定された「コメント開始位置」から始まるようになります。そうでなければ、コメントは、コードが現在置かれている位置より n だけ少なく字下げされます、ここで n は、 -d n コマンド行のパラメータによって指定されます。 1 行の内でプログラムコードが指定されたコメント開始位置を超えて続いていた場合には、さらにその右へとコメントを続けますが、極端に行が長かった場合には、自動的に右マージンが広くとられることがあります。

プリプロセッサ行

一般的に indent は、プリプロセッサの行をそのまま出力します。唯一の例外は、その行の右側にコメントが書かれている時で、そのコメントを整形します。ただし、マクロの展開の結果プログラムに埋込まれるコメントは、処理しません。また、 indent は、条件付きコンパイルのマクロ ( #ifdef...#endif) を認識し、それによってもたらされる構文上の異常を正しく補おうとします。

C 言語の構文

indent ユーティリティは、 C 言語の構文をかなり理解しますが、「手ぬるい」構文解析しか行いません。不完全だったり正しくない構文も、ごく普通のものならなんとか処理しようとします。とくにあげると、以下のようなマクロも適当に処理されます。

#define forever for(;;)

環境変数

indent ユーティリティは、環境変数として、 HOME を使用します。

関連ファイル

./.indent.pro
デフォルトの設定を記述したプロファイルです。
~/.indent.pro
デフォルトの設定を記述したプロファイルです。

歴史

indent コマンドは、 4.2BSD で登場しました。

バグ

indent ユーティリティは、 ls(1) 以上に多くのオプションを持っています。

よくある間違いは、ディレクトリにある全ての C プログラムを整形しようとして

indent *.c

と入力してしまうことです。おそらく、これは、バグであって仕様と言うべきではないでしょう。

March 3, 2012 FreeBSD