使用中的方法跳转到下一行而不是跳转参数

时间:2020-03-25 08:40:12

标签: llvm-clang clang-format

在这种情况下,我在配置我的clang格式文件时遇到了麻烦。这可能是一个虚拟的问题,但我尝试了几种组合,但无法进行设置。

我所拥有的:

  bool res = MethodName(<ParameterList>);
  res      = res && AdtVec_Equal(<ParameterList>);
  res      = res && AdtVec_Equal(<ParameterList>);
  res      = res &&
        AdtVec_Equal(<ParameterList>); //same num of parameters, longer names

我想要的:

  bool res = MethodName(<ParameterList>);
  res      = res && AdtVec_Equal(<ParameterList>);
  res      = res && AdtVec_Equal(<ParameterList>);
  res      = res && AdtVec_Equal(<ParamA>, <ParamB>,
                                 <ParamC>);

我认为这是由于columnLimit值引起的,但我不想将其设置得更长。有什么想法吗?

我的.clang格式文件如下:

BasedOnStyle: LLVM

AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true
AlignConsecutiveMacros: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
  BeforeElse: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Stroustrup
BreakBeforeTernaryOperators: false
BreakInheritanceList: AfterColon
ColumnLimit: 80
ContinuationIndentWidth: 8
IncludeBlocks: Regroup
IndentCaseLabels: true
IndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: false
PenaltyReturnTypeOnItsOwnLine: 100
PointerAlignment: Left
ReflowComments: false
SortIncludes: true
SpacesBeforeTrailingComments: 2
Standard: Auto

谢谢。

1 个答案:

答案 0 :(得分:0)

简短的回答:我看不到任何避免这种情况的合理方法。

clang-format的确切行为将根据参数的长度以及函数调用是本身还是表达式的一部分而变化。要查看差异,我创建了一个示例输入文件:

int f()
{
  bool res = MethodName(a, b, c, d);
  res      = res && AdtVec_Equal(a, b, c, d);
  res      = res && AdtVec_Equal(a, b, c, d);
  res      = res && AdtVec_Equal(aLooooooooong, bLooooooong, cLoooooooong, dLoooooong);
  res      = res && AdtVec_Equal(aLooooooooonger, bLooooooonger, cLoooooooonger, dLoooooonger);

  AdtVec_Equal(a, b, c, d);
  AdtVec_Equal(aLooooooooooooong, bLooooooooooong, cLoooooooooooong, dLoooooooooong);
}

您的.clang-format设置然后产生以下内容:

int f()
{
  bool res = MethodName(a, b, c, d);
  res      = res && AdtVec_Equal(a, b, c, d);
  res      = res && AdtVec_Equal(a1, b1, c1, d1);
  res      = res &&
        AdtVec_Equal(aLooooooooong, bLooooooong, cLoooooooong, dLoooooong);
  res = res && AdtVec_Equal(aLooooooooonger, bLooooooonger, cLoooooooonger,
                            dLoooooonger);

  AdtVec_Equal(a, b, c, d);
  AdtVec_Equal(aLooooooooooooong, bLooooooooooong, cLoooooooooooong,
               dLoooooooooong);
}

请注意,如果参数真的是 长,则可以按照自己喜欢的方式获取参数(AdtVec_Equalres在同一行,并且参数会中断并获取在第一个参数下排列)。但是有一个窗口,其中的参数足够长以阻止一行上的所有内容,但又足够短以允许AdtVec_Equal调用适合一行,因此在该窗口内,clang-format really 希望将AdtVec_Equal呼叫完全放在一行上。

可能的解决方法:

  1. 您可能不喜欢它,但是您可以将PenaltyExcessCharacter设置为很小的值,例如10。结果如下:

    int f()
    {
      bool res = MethodName(a, b, c, d);
      res      = res && AdtVec_Equal(a, b, c, d);
      res      = res && AdtVec_Equal(a1, b1, c1, d1);
      res = res && AdtVec_Equal(aLooooooooong, bLooooooong, cLoooooooong, dLoooooong);
      res = res && AdtVec_Equal(aLooooooooonger, bLooooooonger, cLoooooooonger,
                                dLoooooonger);
    
      AdtVec_Equal(a, b, c, d);
      AdtVec_Equal(aLooooooooooooong, bLooooooooooong, cLoooooooooooong,
                   dLoooooooooong);
    }
    

    这样可以避免在与AdtVec_Equal分开的一行上进行res调用。但是要实现这一点,它会使等号不对齐,并且还将行扩展到超过80个字符。可能还会弄乱代码的其他部分。

  2. 您可以按照自己喜欢的方式手动设置代码格式,然后用// clang-format off// clang-format on包围代码。


我使用clang-format 6.0.0进行了测试,还使用configurator测试了10.0.0。因此,这种行为已经存在了一段时间,如果没有人创建新的样式选项并提交修补程序来实现它,该行为可能不会改变。

相关问题