我们希望使我们的C ++大括号样式更加一致。现在,我们的代码包含以下内容:
if (cond)
{
// ...
}
else
{
// ...
}
...和
if (cond) {
// ...
} else {
// ...
}
我们只想使用后一种风格。
但是,我们不想要更改代码的缩进。我尝试过使用astyle,bcpp,GNU indent和Uncrustify(我看过GreatCode的命令行选项)。不幸的是,这些工具中的每一个都坚持重新输入我们的代码,并且大多数工具都非常糟糕地破坏了C ++构造函数初始化程序列表和预处理程序宏。
是否有任何C ++代码美化器可以修复大括号而只留下缩进?它不一定是一个预先存在的工具 - 如果你知道如何使用一些疯狂的Perl单线程,这也很好。谢谢!
更新:是的,我们知道这会使旧版代码难以读取差异。这是一个长期推迟的代码清理,我们已经确定一致格式化的日常优势超过任何版本控制困难。
答案 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> {
中移除行尾。
要将其应用于源树,请使用find
和xargs
:
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%这样的问题。尝试一下,了解正则表达式总是很好的做法。 :)