重新格式化C ++括号而不改变缩进?

时间:2009-06-12 12:12:17

标签: c++ formatting coding-style indentation curly-braces

我们希望使我们的C ++大括号样式更加一致。现在,我们的代码包含以下内容:

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

...和

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

我们只想使用后一种风格。

但是,我们想要更改代码的缩进。我尝试过使用astyle,bcpp,GNU indent和Uncrustify(我看过GreatCode的命令行选项)。不幸的是,这些工具中的每一个都坚持重新输入我们的代码,并且大多数工具都非常糟糕地破坏了C ++构造函数初始化程序列表和预处理程序宏。

是否有任何C ++代码美化器可以修复大括号而只留下缩进?它不一定是一个预先存在的工具 - 如果你知道如何使用一些疯狂的Perl单线程,这也很好。谢谢!

更新:是的,我们知道这会使旧版代码难以读取差异。这是一个长期推迟的代码清理,我们已经确定一致格式化的日常优势超过任何版本控制困难。

6 个答案:

答案 0 :(得分:7)

这是一个Perl单行程,可以做你想要的。

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;
}

进入这个:

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;
}

答案 1 :(得分:3)

在这样做之前,你真的应该三思而后行三次。它会在变化点完全破坏源代码控制系统的修订历史。您正在使用源代码控制系统,不是吗?

答案 2 :(得分:2)

UNIX命令缩进(http://en.wikipedia.org/wiki/Indent_(Unix))(适用于GNU的PC)有一百万个选项可以完全按照您的喜好自定义重新格式化。

答案 3 :(得分: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

首先将} <eol> <whitespace> else变为} 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;}'

答案 4 :(得分:1)

手上没有简单的正则表达式会不会这样做?喜欢(\)。?\ n。?\ {) - &gt; (\)\ {)删除右括号和左右括号之间的空格。

答案 5 :(得分:0)

我在过去通过首先运行像astyle这样的工具来完成我们想要的95%,然后在结果上编写Perl或Python脚本来完成剩下的5%这样的问题。尝试一下,了解正则表达式总是很好的做法。 :)