如何使 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
选项可用
可以帮助解决这个问题。
我的代码有 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
选项可用
可以帮助解决这个问题。