如何控制链接方法调用的clang-format缩进

How to control clang-format indentation of chained method calls?

本文关键字:调用 方法 clang-format 缩进 链接 何控制 控制      更新时间:2023-10-16

我想让结果看起来像这样:

auto foo = FooBuilder()
    .WithSomething()
    .WithSomethingElse()
    .Build();

但是clang-format的格式是这样的:

auto foo = FooBuilder()
               .WithSomething()
               .WithSomethingElse()
               .Build();

我希望链接调用相对于前一行的开始缩进,而不是相对于FooBuilder()调用。我在clang-format选项中看不到任何控制这一点的东西。设置ContinuationIndentWidth没有帮助。什么好主意吗?

不幸的是,这似乎是不可能的。我发现影响这一切的唯一选择是ContinuationIndentWidth,正如你所说的,不做你想做的。

我个人想做的是使用下面的正则表达式来查找被分解的链式方法调用:

)s+.

它将匹配一个右括号、1个或多个空白字符(但不为0)和一个句号。你可能没有太多这样的实例,所以你可以手动修复它们,然后为这些行禁用clang-format,这样它就不会在将来出现了:

// clang-format off
auto friggin_cool_object = SuperCoolBuilder().do_what_i_want()
    .figure()
    .out()
    .the()
    .params()
    .too();
// clang-format on

发现使用clang-format选项PenaltyIndentedWhitespace的hack。增加这个惩罚会像这样重新格式化你的核心:

auto foo = 
    FooBuilder()
        .WithSomething()
        .WithSomethingElse()
        .Build();

这不是你最初想要的,但是缩进并不取决于auto foo = 的行长。

对我来说设置PenaltyIndentedWhitespace: 1是有效的