如何使clang格式尊重“表格式”代码格式化

时间:2016-06-24 22:12:17

标签: c++ clang-format

我的代码包含数据表或参数表,这些表在列中对齐如下(设计的简单示例;实际代码有更大的表):

//        Name    Size    Starting val
//        ======= ======= ============
S s = {
        { "Dubs", abc,    123 },
        { "X",    n,      m   },
        { "YZ",   ij / q, kl  } 
    };

//           Name    Size    Starting val
//           ======= ======= ============
w  = Create( "Dubs", abc,    123 );
x  = Create( "X",    n,      m   );
yz = Create( "YZ",   ij / q, kl  );

clang-format杀死表格格式:

//        Name    Size    Starting val
//        ======= ======= ============
S s = {
    { "Dubs", abc, 123 },
    { "X", n, m },
    { "YZ", ij / q, kl }
};

//           Name    Size    Starting val
//           ======= ======= ============
w  = Create( "Dubs", abc, 123 );
x  = Create( "X", n, m );
yz = Create( "YZ", ij / q, kl );

我们的团队希望采用clang格式并自动运行,但这个问题阻碍了我们这样做。我们可以手动浏览并将所有这些案例包装在// clang-format off/on标签中,但那是手工劳动。

有没有办法设置clang-format来保持这样的表格,甚至自动表格化新代码?

1 个答案:

答案 0 :(得分:2)

您将无法获得clang格式来遵守所有自定义内部格式,并且它们的documentation on adding new style options非常严格。在现有代码库中采用clang-format要求 some 妥协。这是这些妥协之一。

在您所处的环境中,我是一个庞大的代码库,其中有数十名工程师以自己的方式进行了固定,并且不愿意更改其内部编码标准。我做了几个大型的重构​​,这些修复有数周的时间间隔。不是很好的利用时间。

我无法浏览标准化遗留格式的政策。采用Clang-Formats的前提是要尊重我们的传统格式。

我的解决方案是编写一个包装脚本,该脚本将读取文件,检测内部奇数(在您的情况下,仅查找'='和''的长注释)并将它们夹在clang格式的指令中:

// clang-format off
// AddedByYourTool
//           Name    Size    Starting val
//           ======= ======= ============
w  = Create( "Dubs", abc,    123 );
x  = Create( "X",    n,      m );
yz = Create( "YZ",   ij / q, kl );
// clang-format on

然后它将通过clang格式进行管道传输。然后在输出中找到AddedByYourTool,并删除周围的clang格式。 (您需要该令牌,以免删除现有的clang格式错误)。

很烂。这是一个可怕的解决方案,但是除非您有能力命令该格式终止运行,或者没有政治技巧来谈判使其终止运行,或者除非您有剩余职业生涯需要手动重新设置格式,否则这是唯一的真正解决方案。