INDENT(1)

名称
indent - C 言語プログラムの字下げと整形

書式
indent [input-file [output-file]] [-bad | -nbad] [-bap | -nbap] [-fbs | -nfbs] [-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] [-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 の整形スタイルは以下にあげるオプションで制御します。

-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
        }

-cn プログラムコードの右側に書かれたコメントの開始位置を指定します。 デフォルトでは 33 桁目です。

-cdn
    宣言の右側に書かれたコメントの開始位置を指定します。 デフォルトではプログラムコードの右側に書かれたコメントと同じ位置 になります。

-cdb, -ncdb
    コメント区切りを独立の行とするかどうかを指定します。 このオプションを有効にすると、コメントは以下のようになります。

        	/*
        	 * this is a comment
        	 */

    一方、 -ncdb では以下のようになります。

        	/* this is a comment */

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

-ce, -nce
    -ce は `else' を直前の `}' につけて ``} else'' のように出力します。 デフォルトは -ce です。

-cin
    継続行の字下げを n で指定します。 継続行は、その文の最初の行の先頭から指定した字数だけ字下げされます。 -lp が有効でなければ、または、 継続行の字下げがメインの字下げのちょうど半分でないならば、 かっこで括られた式は、 入れ子になっていることを示すために余分に字下げされます。 -ci のデフォルトは -i と同じ値です。

-clin
    case ラベル字下げ位置を switch 文の字下げ位置から n 個目のタブストップにします。 -cli0.5 なら、タブストップの半分になります。 デフォルトは -cli0 です。

-dn プログラムコードの右側に書かれたものでない独立したコメントに関して、 その場所を制御します。 例えば -d1 で、コードの字下げより 1 段左側にします。 デフォルトの -d0 を指定すると、プログラムコードの字下げに合わせます。 下記「コメントの 字下げ」の節を参照して下さい。

-din
    大域変数名と全ての構造体 / 共用体のメンバ名の、 それらの型宣言の開始位置からの字下げを文字数で指定します。 デフォルトは -di16 です。

-dj, -ndj
    -dj は宣言を左揃えにします。 -ndj は、プログラムコードと同じ字下げを行います。 デフォルトは -ndj です。

-ei, -nei
    else-if に対し特別な処理をするよう指定します(しません)。 これを指定すると、 else に続く if は、最初の if 文と同じだけ字下げされます。 -ei がデフォルトです。

-fbs, -nfbs
    関数宣言と開き中括弧を 2 行に分けるよう指定します(しません)。 デフォルトは、 -fbs です。

-fc1, -nfc1
    -fc1 で、コメントが 1 桁目から始まっている場合も整形します(しません)。 プログラマが意図的にそうしている場合がありますから、 そのような場合に、 -nfc1 を使うべきではありません。 デフォルトは -fc1 です。

-fcb, -nfcb
    ブロックコメント (`/*\n' で開始するコメント) の整形を 有効とするかどうかを指定します。 プログラマは、 ブロックコメントをそれ程は注意深く手動整形していないことが多いですが、 再整形によって改行位置だけを変えるということは望ましくないことがあります。 このような場合には -nfcb を使います。 ブロックコメントはボックスコメントのように扱われます。 デフォルトは -fcb です。

-in 1 段の字下げ量を指定します。デフォルトは 8 文字です。

-ip, -nip
    パラメータ宣言を左マージンからさらに字下げします(しません)。 デフォルトは -ip です。

-ln 出力行の最大幅を指定します。デフォルトは 78 文字です。

-ldin
    局所変数の、その型宣言の開始位置からの字下げを文字数で指定します。 局所変数名のデフォルトは、大域変数の値と同じだけの字下げです。

-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 が標準入力に対して処理を行い、結果を標準出力に出力するようします。

-Ttypename
    typename を型名として扱うように追加します。 -T は幾つ使ってもかまわないので、複数の型名を指定できます。 プログラム中で typedef によって定義された型名は必ず指定する必要があります。 - 多少の指定を 忘れたところで実害は全くありませんが、プログラムは意図した程 きれいには整形されないでしょう。 全部の型名を指定しなければならないのは大変なように思えますが、 実際にはこれは C 言語のもつ問題が表面化したに過ぎません。 つまり、 typedef は、言語の構文解釈を変えてしまうので、 indent は typedef で定義された型名を全て見付けることができないわけです。

-troff
    troff(1) で処理できるフォーマットで出力します。 vgrind(1) と全く同じ考え方に基づいて、出力をきれいにしようとします。 出力ファイルが指定されていないと、出力先として入力ファイルではなく 標準出力が使われます。

-ut, -nut
    出力におけてタブ文字を使用するよう指定します(しません)。 タブは 8 で割り切れるカラムで整列されると想定します。 デフォルトは、 -ut です。

-v, -nv
    -v で `verbose' モードになります。 -nv は `verbose' モードを抑止します。 `verbose' モードでは、入力中の 1 行が複数行に分割された場合には、 その旨を表示し、終了時には出力サイズについての情報を 付け加えるようになります。 デフォルトは -nv です。

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

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

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

  コメントの字下げ
プログラムコードの右側のコメントは、コマンド行のオプション -cn で指定された「コメント開始位置」から始まるようになります。 その他のコメントは、コマンド行のオプション -dn が指定されると、プログラムコードがおかれている位置よりも 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

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