代码之家  ›  专栏  ›  技术社区  ›  emk

在不改变缩进的情况下重新格式化C++括号吗?

  •  6
  • emk  · 技术社区  · 15 年前

    我们希望使我们的C++支架风格更加一致。现在,我们的代码包含以下内容:

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

    ……和:

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

    我们只想使用后一种样式。

    然而,我们 不要 想要更改代码的缩进。我尝试过使用astyle、bcpp、gnu indent和uncrestify(我已经研究过greatcode的命令行选项)。不幸的是,这些工具中的每一个都坚持重新编码我们的代码,并且其中大部分都严重地损坏C++构造函数初始化列表和预处理器宏。

    有没有任何一种C++代码美化器可以在不留下凹痕的情况下修复支架?它不必是一个预先存在的工具——如果您知道如何使用一些疯狂的perl-one行程序来实现这一点,那么这也很好。谢谢您!

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

    6 回复  |  直到 15 年前
        1
  •  7
  •   Josh Kelley    15 年前

    这里有一个PerlOne的行程序,可以满足您的需要。

    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;
    }
    
        2
  •  3
  •   anon    15 年前

    你真的应该三思而后行。它将在更改点完全破坏源代码控制系统的修订历史。你使用的是源代码控制系统,不是吗?

        3
  •  2
  •   James Curran    15 年前

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

        4
  •  2
  •   laalto    15 年前
    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;}'
    
        5
  •  1
  •   DaClown    15 年前

    一只手上装满了简单的regex,难道就不会成功吗?像(\)。 ?\n ?\)->(\)删除右括号和左花括号之间的空格。

        6
  •  0
  •   Brian Neal    15 年前

    我以前处理过这样的问题,首先运行Astyle这样的工具来完成95%的工作,然后在结果上编写Perl或Python脚本来完成剩下的5%。试试看,了解正则表达式总是很好的做法。:)