如何控制链式方法调用的 clang 格式缩进?

问题描述 投票:0回答:2

我希望结果看起来像这样:

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

而是

clang-format
将其格式化为这样:

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

我希望链式调用相对于前一行的开头缩进,而不是相对于

FooBuilder()
调用缩进。我在
clang-format
选项中没有看到任何控制它的内容。设置
ContinuationIndentWidth
没有帮助。有什么想法吗?

c++ indentation clang-format
2个回答
4
投票

发现使用 clang-format 选项的 hack

PenaltyIndentedWhitespace
。 增加这个惩罚将像这样重新格式化你的核心:

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

这不是您最初想要的,但是缩进不取决于

auto foo = 
行长度。

对我来说设置

PenaltyIndentedWhitespace: 1
有效。


2
投票

不幸的是,这似乎是不可能的。我发现的唯一会影响这个问题的选项是

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
© www.soinside.com 2019 - 2024. All rights reserved.