.\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. .\" Copyright (c) 1976 Board of Trustees of the University of Illinois. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)indent.1 8.1 (Berkeley) 7/1/93 .\" jpman %Id: indent.1,v 1.4 1997/06/28 00:13:51 ken Stab % .\" .Dd July 1, 1993 .Dt INDENT 1 .Os BSD 4.2 .Sh 名称 .Nm indent .Nd C 言語プログラムの字下げと整形 .Sh 書式 .Nm indent .Op Ar input-file Op Ar output-file .Op Fl bad | Fl nbad .Op Fl bap | Fl nbap .Bk -words .Op Fl bbb | Fl nbbb .Ek .Op Fl \&bc | Fl nbc .Op Fl \&bl .Op Fl \&br .Op Fl c Ns Ar n .Op Fl \&cd Ns Ar n .Bk -words .Op Fl cdb | Fl ncdb .Ek .Op Fl \&ce | Fl nce .Op Fl \&ci Ns Ar n .Op Fl cli Ns Ar n .Op Fl d Ns Ar n .Op Fl \&di Ns Ar n .Bk -words .Op Fl fc1 | Fl nfc1 .Ek .Op Fl i Ns Ar n .Op Fl \&ip | Fl nip .Op Fl l Ns Ar n .Op Fl \&lc Ns Ar n .Op Fl \&lp | Fl nlp .Op Fl npro .Op Fl pcs | Fl npcs .Op Fl psl | Fl npsl .Op Fl \&sc | Fl nsc .Bk -words .Op Fl sob | Fl nsob .Ek .Op Fl \&st .Op Fl troff .Op Fl v | Fl \&nv .Sh 解説 .Nm は .Ar C 言語プログラムの整形を行います。 .Ar input-file 中の .Ar C プログラムをオプションに従って整形し直します。 以下で説明するオプションはファイル名の前後で指定できます。 .Pp .Sy 注釈 : .Ar input-file のみを指定した場合、整形は「同じ場所に」行われます。つまり、整形結果は .Ar input-file に書き戻され、カレントディレクトリに元の .Ar input-file のバックアップがコピーされます。例えば .Ar input-file の名前が .Sq Pa /blah/blah/file だったとすると、バックアップファイルの名前は .Pa file.BAK となります。 .Pp .Nm は .Ar output-file が指定されると、念のため、それが .Ar input-file とは異なっていることをチェックします。 .Pp .Nm の整形スタイルは以下にあげるオプションで制御します。 .Bl -tag -width Op .It Fl bad , nbad .Fl bad を指定すると、宣言ブロックの後ごとに空行を 1 行入れます。デフォルトは .Fl nbad です。 .It Fl bap , nbap .Fl bap を指定すると、関数本体の後ごとに空行を 1 行入れます。デフォルトは .Fl nbap です。 .It Fl bbb , nbbb .Fl bbb を指定すると、コメントブロックの前に必ず空行を 1 行入れます。デフォルトは .Fl nbbb です。 .It Fl \&bc , nbc .Fl \&bc を指定すると、宣言の中のコンマの後ごとに改行を入れます。 .Fl nbc はこれを抑止します。デフォルトは .Fl \&nbc です。 .It Fl \&br , \&bl .Fl \&bl を指定すると、複合文は以下のように行分けされます。 .ne 4 .Bd -literal -offset indent if (...) { code } .Ed .Pp 一方、デフォルトは .Fl \&br ですが、以下のようになります。 .ne 3 .Bd -literal -offset indent if (...) { code } .Ed .Pp .It Fl c Ns Ar n プログラムコードの右側に書かれたコメントを指定の桁位置に揃えます。デ フォルトでは 33 桁目に揃えられます。 .It Fl cd Ns Ar n 宣言の右側に書かれたコメントを指定の桁位置に揃えます。デフォルトでは プログラムコードの右側に書かれたコメントと同じ位置(つまり .Fl c で指定された位置)になります。 .It Fl cdb , ncdb コメント区切りを独立の行とするかどうかを指定します。コメントブロック だけに有効で、プログラムコードの右側に書かれたコメントには影響しませ ん。デフォルトは .Fl cdb で、コメントは以下のようになります。 .Bd -literal -offset indent .ne 3 /* * this is a comment */ .Ed .Pp 一方、 .Fl ncdb では以下のようになります。 .Bd -literal -offset indent /* this is a comment */ .Ed .Pp .It Fl ce , nce .Fl \&ce は `else' を直前の `}' につけて ``} else'' のように出力します。デフォルトは .Fl \&ce です。 .It Fl \&ci Ns Ar n 継続行の字下げを .Ar n で指定します。継続行は、その文の最初の行の先頭から指定した字数だけ字 下げされます。かっこで括られた式は .Fl \&lp が有効でなければ、入れ子になっていることを示すために余分に字下げされ ます。 .Fl \&ci のデフォルトは .Fl i と同じ値です。 .It Fl cli Ns Ar n case ラベル字下げ位置を .Ic switch 文の字下げ位置から .Ar n 個目のタブストップにします。 .Fl cli0.5 なら、タブストップの半分になります。デフォルトは .Fl cli0 です。 .It Fl d Ns Ar n プログラムコードの右側に書かれたものでない独立したコメントに関して、 その場所を制御します。例えば .Fl \&d\&1 で、コードの字下げより 1 段左側にします。デフォルトの .Fl \&d\&0 を指定すると、プログラムコードの字下げに合わせます。下記「コメントの 字下げ」の節を参照して下さい。 .It Fl \&di Ns Ar n 宣言子からそれに続く識別子への字下げを文字数で指定します。デフォルト は .Fl di16 です。 .It Fl dj , ndj .Fl \&dj は宣言を左揃えにします。 .Fl ndj は、プログラムコードと同じ字下げを行います。デフォルトは .Fl ndj です。 .It Fl \&ei , nei .Ic else-if に対し特別な処理するよう指定します(しません)。 .Fl \&ei は特別な処理を行い、 .Ic else に続く .Ic if は、最初の if 文と同じだけ字下げされます。 .Fl ei がデフォルトです。 .It Fl fc1 , nfc1 .Fl fc1 で、コメントが 1 桁目から始まっている場合も整形します(しません)。こ のような場合には、おうおうにしてプログラマが意図的にそうしているので あって、 .Fl nfc1 を使うべきではありません。デフォルトは .Fl fc1 です。 .It Fl i Ns Ar n 1 段の字下げ量を指定します。デフォルトは 8 文字です。 .It Fl \&ip , nip パラメータ宣言を左マージンからさらに字下げします(しません)。 デフォルトは .Fl \&ip です。 .It Fl l Ns Ar n 出力行の最大幅を指定します。デフォルトは 78 文字です。 .It Fl \&lp , nlp 継続行において括弧内のプログラムコードの位置を揃えます。左括弧がその 行で閉じていない時、継続行を前の行の左括弧の 1 文字後ろから始まるよ うにします。例えば、 .Fl nlp が指定されると継続行は以下のようになります。 .ne 2 .Bd -literal -offset indent p1 = first_procedure(second_procedure(p2, p3), \ \ third_procedure(p4, p5)); .Ed .Pp .ne 5 一方、 .Fl lp が指定されるとが指定されると、プログラムコードは以下のようには幾分見 やすくなります。 .Bd -literal -offset indent p1\ =\ first_procedure(second_procedure(p2,\ p3), \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ third_procedure(p4,\ p5)); .Ed .Pp .ne 5 2行余分に改行された場合には、下のようになります。 .Bd -literal -offset indent p1\ =\ first_procedure(second_procedure(p2, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p3), \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ third_procedure(p4, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ p5)); .Ed .It Fl npro 字下げのプロファイル .Sq Pa ./.indent.pro と .Sq Pa ~/.indent.pro , を使わないようになります。 .It Fl pcs , npcs .Fl pcs が指定されると、全ての関数呼出しの関数名と括弧の間に空白を 1 つ入れます。デフォルトは、 .Fl npcs です。 .It Fl psl , npsl .Fl psl が指定されると、関数定義における関数の名前を 1 桁目から始め ます。つまり、その関数の型名は前の行に置かれることになります。デフォ ルトは、 .Fl psl です。 .It Fl \&sc , nsc 全てのコメントの左端に、アスタリスク(`*') を置きます(置きません)。 デフォルトは .Fl sc です。 .It Fl sob , nsob .Fl sob が指定されると、不要な空白行を取除きます。宣言部の後ろの余分な空白行 を取り除くのに便利です。デフォルトは、 .Fl nsob です。 .It Fl \&st .Nm が標準入力に対して処理を行い、結果を標準出力に出力するようします。 .It Fl T Ns Ar typename .Ar typename を型名として扱うように追加します。 .Fl T は幾つ使ってもかまわないので、複数の型名を指定できます。 プログラム中で .Ic typedef によって定義された型名は必ず指定する必要があります。\- 多少の指定を 忘れたところで実害は全くありませんが、プログラムは意図した程きれいに は整形されないでしょう。全部の型名を指定しなければならないのは大変な ように思えますが、実際にはこれは C 言語のもつ問題が表面化したに過ぎ ません。つまり、 .Ic typedef は、言語の構文解釈を変えてしまうので、 .Nm は .Ic typedef で定義された型名を全て見付けることができないわけです。 .It Fl troff .Xr troff 1 で処理できるフォーマットで出力します。 .Xr vgrind 1 と全く同じ考え方に基づいて、出力をきれいにしようとします。出力ファイ ルが指定されていないと、出力先として入力ファイルではなく標準出力が使 われます。 .It Fl v , \&nv .Fl v で `verbose' モードになります。 .Fl \&nv は `verbose' モードを抑止します。`verbose' モードでは、入力中の 1 行 が複数行に分割された場合には、その旨を表示し、終了時には出力サイズに 付いての情報を付け加えるようになります。 デフォルトは .Fl \&nv です。 .El .Pp ログインディレクトリかカレントディレクトリの一方、あるいはその両方に .Pa .indent.pro というプロファイルを作って、その中にオプションを書いておくことにより、 あなたの好みの設定を .Nm のデフォルトとすることができます。プロファイルは、ログインディレクト リ, カレントディレクトリの順で読み込まれるため、カレントディレクトリ に `.indent.pro'があると、そちらの指定の方が優先されます。 .Nm の起動時にプロファイルが存在していると、それを読み込んでデフォルトと して使用します。ただし、コマンド行でオプションを指定すると、それは常 にプロファイル中のオプションよりも優先されます。プロファイルを書く際 には、各オプションを空白かタブもしくは改行で区切ってやらなくてはなり ません。 .Pp .Ss コメント .Sq Em 囲まれた .Em コメント の処理について説明します。 .Nm は、コメント開始の直後にマイナスやアスタリスクが続いている(つまり `/*\-' もしくは`/**' となっている)場合、そのコメントをアスタリスクで 周囲を囲まれたものとみなします。このようなコメントに対しては、コメン トの最初の行に施される字下げ位置に、続く各行を揃える他は、処理を行い ません。 .Pp つぎに、 .Em 連続したテキスト としての処理について説明します。 上にあげた以外のコメントは、連続したテキストとして扱います。 .Nm は 1 行にできるだけ多くの単語(空白やタブもしくは改行で区切られた文字 列)を詰め込もうとします。また、空白行により段落が分けられます。 .Pp .Ss コメントの字下げ プログラムコードの右側のコメントは、コマンド行のオプション .Fl c Ns Ns Ar n で指定された「コメント開始位置」から始まるようになります。その他のコ メントは、コマンド行のオプション .Fl d Ns Ns Ar n が指定されると、プログラムコードがおかれている位置よりも .Ar n 段少なく字下げされます。1 行の内でプログラムコードが指定されたコメン ト開始位置を超えて続いていた場合には、さらにその右へとコメントを続け ますが、極端に行が長かった場合には、自動的に右マージンが広くとられる ことがあります。 .Pp .Ss マクロ行 一般に .Nm はプリプロセッサのマクロ行をそのまま出力します。唯一の例外はその行の 右側にコメントが書かれている時で、そのコメントを整形します。ただし、 マクロの展開の結果プログラムに埋込まれるコメントは処理しません。また、 .Nm は条件付きコンパイルのマクロ .Pq Ic #ifdef...#endif を認識し、それによってもたらされる構文上の異常を正しく補おうとしま す。 .Pp .Ss C 言語の構文 .Nm は、C 言語の構文をかなり理解しますが、「寛容な」構文解析しか行いませ ん。不完全だったり正しくない構文も、ごく普通のものならうまく処理しよ うとします。とくにあげると、以下のようなマクロも適当に処理されます。 .Pp .Dl #define forever for(;;) .Pp .Sh 環境変数 .Nm は環境変数として、 .Ev HOME を使用します。 .Sh 関連ファイル .Bl -tag -width "./.indent.pro" -compact .It Pa ./.indent.pro デフォルトの設定を記述したプロファイルです。 .It Pa ~/.indent.pro デフォルトの設定を記述したプロファイルです。 .El .Sh 歴史 .Nm コマンドは .Bx 4.2 で導入されました。 .Sh バグ .Nm は .Xr ls 1 以上に多くのオプションを持っています。 .Pp .ne 5 よくある悲惨な間違いは、ディレクトリにある全ての .Nm C プログラムを整形しようとして .Pp .Dl indent *.c .Pp と入力してしまうことです。おそらく、これはバグであって特徴と言うべき ではないでしょう。