INDENT(1)

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

書式
indent [input-file [output-file]] [-bad | -nbad] [-bap | -nbap] [-bbb | -nbbb] [-bc | -nbc] [-bl] [-br] [-cn] [-cdn] [-cdb | -ncdb] [-ce | -nce] [-cin] [-clin] [-dn] [-din] [-fc1 | -nfc1] [-fcb | -nfcb] [-in] [-ip | -nip] [-ln] [-lcn] [-lp | -nlp] [-npro] [-pcs | -npcs] [-psl | -npsl] [-sc | -nsc] [-sob | -nsob] [-st] [-troff] [-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
    宣言の右側に書かれたコメントを指定の桁位置に揃えます。デフォルトでは プログラムコードの右側に書かれたコメントと同じ位置(つまり -c で指定された位置)になります。

-cdb, -ncdb
    コメント区切りを独立の行とするかどうかを指定します。コメントブロック だけに有効で、プログラムコードの右側に書かれたコメントには影響しませ ん。デフォルトは -cdb で、コメントは以下のようになります。

        	/*
        	 * this is a comment
        	 */

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

        	/* this is a comment */

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

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

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

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

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

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

-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) と全く同じ考え方に基づいて、出力をきれいにしようとします。出力ファイ ルが指定されていないと、出力先として入力ファイルではなく標準出力が使 われます。

-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

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