下記は astyle 1.15.3 の astyle.html を適当に日本語化してみたものです。
Main home Page http://astyle.sourceforge.net Project Page http://www.sourceforge.net/projects/astyle
Artistic Style は C, C++, C#, Java のソースコードのインデントや整形を行える。
ソースコードをインデント付けするとき、プログラマはインデントに合わせて空白とタブ の両方を用いやすい。さらに、エディタによってはデフォルトでタブキーが押されると空白を挿入したり、また(例えばEmacsでは)行中のコードの手前に自動で空白を置いたりあるいは段付けに今までタブだけを使用したコードに空白を挿入したりして行を整えたりする。
ソースを編集するエディタを変更したとき 、タブ文字が画面上で空白何文字分になるか、というのはプログラマがよく直面する問題の一つだ。ソースコードを空白とタブを用いて完璧にインデントしていても、エディタを替えたとたん、台無しになるかもしれない(ユーザーがその値を設定しなおしていない場合)。たとえ、あなたがプログラマで気おつけて空白かタブのみを用いたとしても、他人のソースコードを見る場合は問題をかかえたままだろう。
この問題に取り組むために Artistic Style は作られた ―― C/C++/C#/Java ソースファイルを自動で再インデント&整形する一連のフィルタとしてC++で作成された。これはコマンドラインで使用でき、また、別のC++プログラムに内蔵することもできる。
Artistic Style は「 GNU Genral Public License (GPL)」下で使用/配布できる。
1) astyle.zip を解凍(Unzip)して、'astyle' をコンパイルする。(readme.txtの指示を読むこと)
2) 解凍後の実行ファイルのあるディレクトリを、システムの環境変数 PATH に追加するか、もしくはパスの通ったディレクトリに実行ファイルを移動すること。
3) 次の構文で実行できる:
astyle [オプション] < 元ソースファイル名 > 整形済ソースファイル名
あるいは
astyle [オプション] Foo.java Bar.javaAnotherBar.java [ . . . ]
< と > は標準入出力リダイレクト指定の文字で、忘れないように!!!
整形済みの新しいファイルは、元のファイル名で作成される。 元のファイルは、元ファイル名に".orig" を付加した名前のファイルにリネームされる。
したがって、上記のように Foo.java をインデントした場合、インデント前の元ファイルは Foo.java.origにリネームされ、インデントした結果は Foo.java の名になるだろう。
C/C++/C#スタイルに関するオプション指定のない場合は、デフォルトの空白4個のインデントで整形無しとなる。
オプションには2種類の表記がある:
- ロング・オプション:
2文字の'-- 'で始まるオプションで、 1度に1つしか指定できない。
(e.g. --brackets=attach --pad --indent=spaces=4 ).- ショート・オプション:
1文字の'- 'で始まるオプションで、 一度に複数を指定できる。
したがって、 -bps4 と書いた場合は -b -p -s4 と同じことになる.
デフォルトで使用するオプションを デフォルトオプションファイル に記述できる:
- Artistic Style は次の手順で デフォルトオプションファイルを探す:
1. 環境変数ARTISTIC_STYLE_OPTIONS が存在すればその値。
2. 環境変数HOME の指すディレクトリにある .astylerc という名のファイル。
(つまり $PATH/.astylerc)
3. 環境変数HOMEPATHの指すディレクトリにある .astylerc という名のファイル。
(つまり %HOMEPATH%\.astylerc)- オプションは、改行、または、タブ、空白で区切られる。
- ロング・オプションは、オプションファイル中では'--'無しで記述できる。
- '# 'から始まるオプション・ファイル内の行は、行コメントとなる。
- デフォルトオプションファイルの例:
# デフォルトでは java ファイルを解析する
mode=java
# ブラケットは、ブラケット行の直前に付けられる
brackets=attach
# 1インデントは空白6個
indent=spaces=6
# switchブロックはインデントする
indent-switches
# オリジナルファイルにつけるサフィックスは.pre
suffix=.pre
現在利用できるあらかじめ定められたスタイル・オプションは以下のとおり:
--style=ansi
ANSI スタイルのインデント/整形.namespace foospace
{
int Foo()
{
if (isBar)
{
bar();
return 1;
}
else
return 0;
}
}--style=kr
カーニハン&リッチー・スタイルのインデント/整形.namespace foospace {
int Foo() {
if (isBar) {
bar();
return 1;
} else
return 0;
}
}--style=linux
Linux スタイルのインデント/整形 (ブラケットは、classや関数宣言では分離するが、命令文に対しては接続する。インデントは空白8個で行われる)。namespace foospace
{
int Foo()
{
if (isBar) {
bar();
return 1;
} else
return 0;
}
}--style=gnu
GNU スタイルのインデント/整形.namespace foospace
{
int Foo()
{
if (isBar)
{
bar();
return 1;
}
else
return 0;
}
}--style=java
Java スタイルのインデント/整形.class foospace {
int Foo() {
if (isBar) {
bar();
return 1;
} else
return 0;
}
}現在利用できるインデントのオプションは下記のとおり:
-c OR --mode=c
C, C++, C# ファイルとしてインデント.-j OR --mode=java
Java ファイルとしてインデント.-s# OR --indent=spaces=#
インデントを空白# 文字にする。 (したがって -s4 OR --indent=spaces=4).-t OR -t# OR --indent=tab=#
インデントにタブ文字を使う. 空白# 文字として扱う。 '#'の指定がなければ空白4文字とする。-T# OR --force-indent=tab=#
インデントにタブ文字を使う。 空白# 文字として扱う。 '--indent= tab'では複行文の中では空白を用いるが、その範囲もタブを用いる。-C OR --indent-classes
classブロックで'class' に対し、 'public:', 'protected:' 'private:' をインデントする。.デフォルト:
class Foo
{
public:
Foo();
virtual ~Foo();
};指定時:
class Foo
{
public:
Foo();
virtual ~Foo();
};-S OR --indent-switches
'switch' に対して 'case XXX:' をインデントする。デフォルト:
switch (foo)
{
case 1:
a += 2;
break;
default:
a += 2;
break;
}指定時:
switch (foo)
{
case 1:
a += 2;
break;
default:
a += 2;
break;
}-K OR --indent-cases
'case XXX:' とその下の命令行の深さが同じになるように、'case XXX:'をインデントする。デフォルト:
switch (foo)
{
case 1:
{
a += 2;
break;
}
default:
{
a += 2;
break;
}
}指定時:
switch (foo)
{
case 1:
{
a += 2;
break;
}
default:
{
a += 2;
break;
}
}-B OR --indent-brackets
ブラケットを余分にインデントする。デフォルト:
if (isFoo)
{
bar();
}
else
{
anotherBar();
}指定時:
if (isFoo)
{
bar();
}
else
{
anotherBar();
}-G OR --indent-blocks
全ブロックに余分なインデントを行う。デフォルト:
if (isFoo)
{
bar();
}
else
anotherBar();指定時:
if (isFoo)
{
bar();
}
else
anotherBar();-N OR --indent-namespaces
namespaceに対して余分にインデントする。デフォルト:
namespace foospace
{
class Foo
{
public:
Foo();
virtual ~Foo();
};
}指定時:
namespace foospace
{
class Foo
{
public:
Foo();
virtual ~Foo();
};
}
-L OR --indent-labels
ラベルを余分にインデントする。左端に寄せる(デフォルト)のではなく、現在のインデントに対し1つ左にインデントされている。デフォルト:
int foospace()
{
while (isFoo)
{
...
goto error;
error:
...
}
}指定時:
int foospace()
{
while (isFoo)
{
...
goto error;
error:
...
}
}-M# OR --max-instatement-indent=#
前の行に対し連続的な文でのインデントは最大空白 # 文字にする。(したがって --max-instatement-indent=40)-m# OR --min-conditional-indent=#
複数行になった条件文の継続行をインデントする最小の値。これは、つづく命令文と見分け安くするためにある。デフォルトでは現在のインデント2つ分となる。 (したがって --min-conditional-indent=8)デフォルト:
// default setting makes this non-bracketed code clear
if (a < b
|| c > d)
foo++;
// but creates an exaggerated indent in this bracketed code
if (a < b
|| c > d)
{
foo++;
}--min-conditional=0 の時:
// setting makes this non-bracketed code less clear
if (a < b
|| c > d)
foo++;
// but makes this bracketed code prettier
if (a < b
|| c > d)
{
foo++;
}--indent-preprocessor
複数行のプリプロセッサ定義をインデントする。 適切な結果を得るには --convert-tabs を一緒に指定すべき。それなりに綺麗になるが、不明瞭なプリプロセッサ定義に奇跡が起こるわけではない。--convert-tabs
タブを空白に変換する。-E OR --fill-empty-lines
空行を、それらの前行の空白で満たす。現在使用できる 整形 オプションとして以下のものがある:
-b OR --brackets=break
ブラケットをブロック前文と行分割する ( つまり ANSI C, C++ スタイル ).if (isFoo)
{
bar();
}
else
{
anotherBar();
}-a OR --brackets=attach
ブラケットを(if等の)ブロック前文と同じ行に置く( つまり Java , K&R スタイル ).if (isFoo){
bar();
} else {
anotherBar();
}-l OR --brackets=linux
ブラケットをclassや関数宣言では行分割し、ブロック前文と同じ行に置く。namespace foospace
{
int Foo()
{
if (isBar) {
bar();
return 1;
} else
return 0;
}
}--brackets=break-closing-headers
'--brackets=attach' か '--brackets= linux' を使用したときに、 先行する閉ブラケットと閉ヘッダ(例えば'else', 'catch', ...)を行分割する。if (isFoo){
bar();
}else {
anotherBar();
}指定時:
if (isFoo) {
bar();
}
else {
anotherBar();
}
--break-blocks
ヘッダブロック(例えば 'if', 'while'...)の直前に空行を挿入する.isFoo = true;
if (isFoo) {
bar();
} else {
anotherBar();
}
isBar = false;指定時:
isFoo = true;
if (isFoo) {
bar();
} else {
anotherBar();
}
isBar = false;--break-blocks=all
ヘッダブロック(例えば'if', 'while'...)の前後に空行を挿入する。閉ヘッダーブロック(例えば'else', 'catch')をスタンドアローンなブロックとして扱う。isFoo = true;
if (isFoo) {
bar();
} else {
anotherBar();
}
isBar = false;指定時:
isFoo = true;
if (isFoo) {
bar();
} else {
anotherBar();
}
isBar = false;--break-elseifs
'else if()' を分割する else と if で行分割する。if (isFoo) {
bar();
} else if (isBar()){
anotherBar();
}指定時:
if (isFoo) {
bar();
} else
if (isBar()){
anotherBar();
}-p
OR --pad=oper
演算子だけの場合、前後に空白を挿入する。if (isFoo)
a = bar((b-c)*a,*d--);指定時:
if (isFoo)
a = bar((b - c) * a, *d--);
--pad=paren
括弧()対の内側に空白を挿入する。if (isFoo)
a = bar((b-c)*a,*d--);指定時:
if ( isFoo )
a = bar( ( b-c )*a, *d-- );
-POR --pad=all
演算子の前後と括弧()対の内側に空白を挿入する。if (isFoo)
a = bar((b-c)*a,*d--);指定時:
if ( isFoo )
a = bar( ( b - c ) * a, *d-- );-o OR--one-line=keep-statements
1行に書かれた複雑な文やマルチステートメント行を分割しない。if (isFoo)
{
isFoo = false; cout << isFoo << endl;
}そのまま残す。
if (isFoo) DoBar();
そのまま残す。
-O OR--one-line=keep-blocks
1行で書かれたブロックを分割しない。if (isFoo)
{ isFoo = false; cout << isFoo << endl; }そのまま残す。
現在使用できるその他 のオプションとして次のものがある:
--suffix=####
'orig'の代わりに元ファイル名に付加するサフィックスを #### にする。(したがって --suffix=.prev)-X OR --errors-to-standard-output
標準エラー出力でなく標準出力へエラーおよびヘルプ情報を表示する。
このオプションは、Windows-95のように標準エラー出力を持たないシステム/シェルでは有用だろう。-v OR --version
バージョン番号を表示。-h OR -? OR --help
ヘルプメッセージを表示して終了。
-Special thanks to: Jim Watson, Fred Shwartz, W. Nathaniel Mills III, Danny Deschenes, Andre Houde, Richard Bullington, Paul-Michael Agapow, Daryn Adler for their patches and contributions to Artistic Style !!!
-Special thanks to Richard Bullington andMicroState for giving Artistic Style its original mailing-list !!!
-Special thanks toSourceForge for giving Artistic Style itshome !!!
-Special thanks to Paul Michael Agapow for creating a GUI interface for Artistic Style on the Macintosh.
-Thanks to all the dedicated beta-testers and bug notifiers !!!