【问题标题】:How to make clang-format respect "table-like" code formatting如何使 clang-format 尊重“类似表格”的代码格式
【发布时间】:2016-06-24 22:12:17
【问题描述】:

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

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

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

【问题讨论】:

  • 这对clang的要求太高了!它应该如何知道是否应该格式化结构数组?使用标签看起来是这里唯一的解决方案。或者不采用 clang 格式。
  • 或者,采用 clang-format 并接受必须稍微改变你的编码风格以适应工具。
  • 如果很难自动检测到我想要的东西,我也会对// clang-format table on/off 感到满意。 (无论如何,人工智能有什么好处‽)

标签: c++ clang-format


【解决方案1】:

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

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

我无法驾驭传统格式标准化的政治。采用 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-format 进行管道传输。然后在输出中找到 AdditionalByYourTool 并删除周围的 clang-format off。 (您需要该令牌,因此您不会删除现有的 clang-format offs)。

这很糟糕。这是一个可怕的解决方案,但除非你有权力下令终止这种格式,或者有政治技巧来谈判它,或者觉得在你的职业生涯中想要手动重新格式化,否则它是唯一真正的解决方案。

【讨论】:

  • 我们最终认为值得采用并与我们不喜欢的小东西一起生活,因为总体上节省了时间和心痛的 clang 格式。对于我们不想丢失的表格化代码的情况,我们只是手动将其永久包装在off/on cmets 中。其中一些是我们提前完成的,但大部分我们只是让通过而没有改变。当我们遇到未对齐的表(其中很多在测试代码中)时,我们返回版本控制,带回旧版本,并将其包装在 off/on cmets 中,注意不要丢失任何干预更改.
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 2014-11-17
  • 2022-01-23
  • 2019-06-18
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2018-06-09
相关资源
最近更新 更多