aboutsummaryrefslogtreecommitdiff
path: root/ja/man/man1/indent.1
blob: 461e5d7fff28edf43e5bddb5528a18428f8a3d4c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
.\" 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
と入力してしまうことです。おそらく、これはバグであって特徴と言うべき
ではないでしょう。