【问题标题】:Prevent clang-format from collapsing multi-line if statements into a single line防止 clang-format 将多行 if 语句折叠成一行
【发布时间】: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。见stackoverflow.com/questions/33656800/clang-format-line-breaks/…
  • 感谢@ambiso 的有用提示!不幸的是,更改源代码是不可行的,因为这种格式分布在整个应用程序中。将列限制设置为 0 确实有效,但会产生一些不希望的副作用,例如弄乱 c'tor 参数的对齐方式(可以通过一些调整来修复)。从那时起它也并不理想,没有强制执行列限制,但它仍然比我到目前为止所拥有的更进一步。
  • @ambiso 您能否将您的 cmets 格式化为答案,并可能扩展一下?这样,如果在赏金到期时没有其他答案,我可以奖励你。

标签: c++ clang clang-format


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的提醒和有用的网站!
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2019-12-31
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多