2009-06-12 25 views
6

C++のブレーススタイルをより一貫させたいと考えています。今、私たちのコードが混在含まれていますインデントを変更せずに書式変更したC++のブレース?

if (cond) 
{ 
    // ...  
} 
else 
{ 
    // ... 
} 

を...と:私たちは、もっぱら後者のスタイルを使用したい

if (cond) { 
    // ... 
} else { 
    // ... 
} 

ただし、はありません私たちのコードのインデントを変更したいと思います。私はastyle、bcpp、GNU indentとUncrustifyを使ってみました(そして、私はGreatCodeのコマンドラインオプションを見てきました)。残念なことに、これらのツールはそれぞれコードの再インデントを主張しており、そのほとんどはC++コンストラクタのイニシャライザリストとプリプロセッサマクロを非常に悪いものにしています。

字下げのままで中括弧を修正できるC++コードの美化器はありますか?これは既存のツールである必要はありません。Perlの奇妙なPerlの1つのライナーを使ってこれを行う方法を知っているなら、それも良いことです。ありがとうございました!

更新:はい、これにより、古いコードとの差分を読み取ることが難しくなります。これは長く延期されたコードのクリーンアップであり、一貫した書式の日々の利点がバージョン管理の難しさを上回ると判断しました。

+0

あなたたちは小さなものを発汗しています。 –

答えて

7

ここには、あなたがしたいことをするべきPerlのワンライナーがあります。このように

int main(int argc, char *argv[]) 
{ 
    int something = 0; 
    if (something) // 5-12-2007 
    { 
     printf("Hi!\n"); 
    } 
    else // 5-13-2007 
    { 
     printf("Bye\n"); 
    } 
    return 0; 
} 

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;' 

なお、このターン

int main(int argc, char *argv[]) { 
    int something = 0; 
    if (something) { // 5-12-2007 
     printf("Hi!\n"); 
    } else { // 5-13-2007 
     printf("Bye\n"); 
    } 
    return 0; 
} 
+0

素晴らしい!私はこれを1時間ほどで試してみる。 – emk

+0

多くの感謝!これは良いスタートであり、 'catch'のような他の構造を扱うように適応することができます。 – emk

3

これを行う前に、本当に2回、おそらく3回考えてください。変更点でソースコード管理システムの改訂履歴を完全に破棄します。あなたはソースコード管理システムを使用していますか?

+0

多分私は厚いですが、私はこれを得ていません。私が見る唯一の問題は、変更の前と後のdiffingファイルが多くの差分をもたらすことです。どのように「あなたのソースコード管理システムの改訂履歴を完全に破壊するのか」はわかりません。 – Glen

+3

正確には、短いメソッドが使用されている場合は、おそらく1行おきに差分がたくさんあります。これは差分を無用にします - あなたは再フォーマットによって引き起こされるノイズから実際の変化を取り除くことができません。 –

+2

さて、あなたは正しいです。あなたの改訂履歴を完全に破棄することはありません。影響を受けた新しいコードと変更境界を越えた古いコードとを比較する能力だけが破壊されます。これはあなたまたはあなたのプロジェクトにとって重要であるかもしれません。 – kmarsh

2

UNIXコマンドのインデント(http://en.wikipedia.org/wiki/Indent_(Unix))(GNUのPCで利用可能)には、改造をカスタマイズするための百万のオプションがあります。

+0

私が知る限り、ほとんどのインデントコマンドは、他のすべてのツールと同様に、常にソースコードを再インデントします。あなたはこれをオフにする方法を知っていますか?また、インデントは一般的にC++をサポートしていません。 – emk

+1

(1)必要なオプションを使ってインデントのバージョンを指し示すことができ、(2)マニュアルから明白でないものを説明できる場合は、この回答を受け入れることができます。しかし、私は既に半時間をかけて、運がないGNUインデントを見てきました。 – emk

1

シンプルな正規表現がいっぱい手にはなりませんか?好きな(\)。 ?\ n?\ {) - >(\)\ {を使用して、閉じ括弧と開始中括弧の間のスペースを削除します。

2
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp 

この最初マングル} else} <eol> <whitespace> else、次いで、エンド・オブ・ライン<eol> <whitespace> {から除去します。

findxargsを使用し、ソースツリーにこれを適用するには:

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' 
0

私たちは何を望むかの95%を行うには最初のastyleのようないくつかのツールを実行することにより、過去にこのような問題に取り組んできました、残りの5%を完成させるためにPerlまたはPythonスクリプトを結果に書き込む。試してみてください。あなたの正規表現を知ることは常に良い習慣です。 :)

関連する問題