如何让clang格式的Visual Studio 2015扩展不将大括号放在与if语句相同的行上

时间:2017-04-19 00:16:22

标签: visual-studio-2015 clang-format

从我的观点来看,对于任何大括号都是可选的语言,将大括号放在与if语句相同的行上是不可取的。请考虑以下事项。

if (VeryLongConditionThatIsWiderThanScreen) {
// Thousands of lines of badly indented code.
// You cannot rely on indentation to tell you were the block ends.
}

如果大括号位于if语句的末尾,我必须寻找并按结束键才能确定代码块的结束位置。我讨厌那样做。我是一个狩猎和啄打字员,视力不佳,我需要付出相当大的努力才能找到那个结束键才能找到代码块结束的位置。

我正在尝试使用clang格式,使用ClangFormat Visual Studio 2015 Extension,但我坚持认为它不会将大括号放在与if相同的行上。所有内置样式都可以。我在http://clang.llvm.org/docs/ClangFormatStyleOptions.html阅读了文档并编写了以下.clang格式文件。

---
Language: Cpp
BasedOnStyle: WebKit
AlignAfterOpenBracket: AlwaysBreak
AllowShortBlocksOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakBeforeMultilineStrings: true
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
    AfterControlStatement: true
    AfterEnum: true
    AfterStruct: true
    AfterUnion: true
    BeforeCatch: true
    BeforeElse: true
BreakBeforeBraces: Custom
BreakBeforeInheritanceComma: true
ColumnLimit: 100
ConstructorInitializerAllOnOneLineOrOnePerLine: true
Cpp11BracedListStyle: true
IndentWidth: 2
SortIncludes: false
TabWidth: 2
...

如果我正确解释了文档,那么将AfterControlStatement设置为true会导致clang-format将括号放在if之后的行上,这就是我想要的。这不会发生。我已将.clang格式文件放在与项目文件相同的目录中。我也尝试将其命名为_clang-format。什么都行不通。每次我使用CLang Format Document菜单项时,它会将与if语句关联的所有大括号放在与if相同的行上。

1 个答案:

答案 0 :(得分:1)

事实证明,我的问题是由于我将AllowShortLoopsOnASingleLine和AllowShortBlocksOnASingleLine设置为true所致。

此问题报告为bug 25069 (clang-format BreakBeforeBraces behavior changes with Allow...OnASingleLine parameters)

我最终使用以下.clang格式文件来实现我的目标。

---
Language: Cpp
BasedOnStyle: WebKit
AccessModifierOffset: -2
AlignAfterOpenBracket: AlwaysBreak
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: true
AlwaysBreakBeforeMultilineStrings: true
BreakBeforeBraces: Custom
BraceWrapping:
  AfterClass: true
  AfterControlStatement: true
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: false
  AfterObjCDeclaration: true
  AfterStruct: true
  AfterUnion: true
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
ColumnLimit: 100
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
Cpp11BracedListStyle: true
IndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: false
PointerAlignment: Right
SortIncludes: false
SpacesInContainerLiterals: false
TabWidth: 2
UseTab: ForContinuationAndIndentation
...