防止 clang-format 将多行 if 语句折叠成一行

Posted

技术标签:

【中文标题】防止 clang-format 将多行 if 语句折叠成一行【英文标题】:Prevent clang-format from collapsing multi-line if statements into a single line 【发布时间】:2018-06-23 04:03:22 【问题描述】:

使用默认设置的 clang-format,如下:

if ((exprA) && 
    (exprB))

变成:

if ((exprA) && (exprB))

我试图防止将条件折叠成一行,但没有成功。 目前有没有办法做到这一点?

在 clang 格式 documentation 中,BreakBeforeBinaryOperators 参数似乎最接近我所追求的:

BreakBeforeBinaryOperators(BinaryOperatorStyle) 二元运算符的包装方式。

BOS_None(配置中:None)在运算符后中断。

但它似乎只在需要换行时才起作用(超出列限制),这不是通常的情况。

【问题讨论】:

一种解决方法是在第一行的末尾添加注释。 clang-format 不会加入这些行。 您也可以将ColumnLimit设置为0。见***.com/questions/33656800/clang-format-line-breaks/… 感谢@ambiso 的有用提示!不幸的是,更改源代码是不可行的,因为这种格式分布在整个应用程序中。将列限制设置为 0 确实有效,但会产生一些不希望的副作用,例如弄乱 c'tor 参数的对齐方式(可以通过一些调整来修复)。从那时起它也并不理想,没有强制执行列限制,但它仍然比我到目前为止所拥有的更进一步。 @ambiso 您能否将您的 cmets 格式化为答案,并可能扩展一下?这样,如果在赏金到期时没有其他答案,我可以奖励你。 【参考方案1】:

根据Clang 10 document,您的请求可以完成。您必须对您的 clang 文件进行这两项更改

    BraceWrapping: 中设置AfterControlStatement: true。 设置后ColumnLimit: 1
output -: if ((exprA) &&
              (exprB))

如果您有任何疑问,您可以在Here 试试这个。但问题是您的其他代码也会被格式化。

没有办法只拆分if ((exprA) && (exprB))。如果任何人都可以为此创建补丁,则可以做到,但为此创建补丁并不容易。这需要大量的时间和精力。

【讨论】:

感谢您的提醒和有用的网站!

以上是关于防止 clang-format 将多行 if 语句折叠成一行的主要内容,如果未能解决你的问题,请参考以下文章

clang-format 如何不将 if 语句放在一行中?

clang-format 覆盖 WebKit 样式的多行注释

clang-format:如果语句溢出,则强制参数和参数为一行

我如何告诉 clang-format 遵循这个约定?

防止 clang-format 删除 emacs 的换页符

可以clang格式将大括号添加到单行if语句等