如何使 clang-format 尊重 "table-like" 代码格式

How to make clang-format respect "table-like" code formatting

我的代码有 tables 的数据或参数,这些数据或参数在列中对齐,如下所示(人为的简单示例;实际代码有更大的 tables):

//        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 终止 table 格式:

//        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 并 运行 它,但这个问题阻碍了我们这样做。我们可以手动检查并将所有此类案例包装在 // clang-format off/on 标签中,但这是体力劳动。

有没有办法设置 clang-format 以保持 table 像这样,甚至自动 table-ize 新代码?

您将无法 clang-format 尊重所有自定义内部格式,并且他们的 documentation on adding new style options 非常严格。在现有代码库中采用 clang-format 需要 一些 妥协。这是其中的一种妥协。

我遇到过你的情况,一个庞大的代码库,有数十名工程师固定在他们的方式中,不愿意改变他们的内部编码标准。我已经完成了几个大型重构,其中有数周的时间来修复间距。不好好利用时间。

我无法驾驭标准化遗留格式的政治。 Clang-Formats 采用的条件是尊重我们的旧格式。

我的解决方案是编写一个包装脚本来读取文件,检测内部异常(在你的情况下,寻找只有 '=' 和 ' ' 的长注释)并将它们夹在 clang-format 说明:

// 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-format 进行管道传输。然后在输出中找到AddedByYourTool,将周围的clang-format去掉。 (您需要该令牌,这样您就不会删除现有的 clang-format 优惠)。

糟透了。这是一个可怕的解决方案,但除非你有权力命令这种格式死掉,或者有政治技巧来谈判它死掉,或者想要在你的职业生涯的剩余时间里手动重新格式化,否则它是唯一真正的解决方案。

clang-format 13 开始,有一个新的 AlignArrayOfStructures 选项可用 可以帮助解决这个问题。