Поставить перед двоеточием и после запятой в конструкторе

Я пытаюсь создать формат инициализатора конструктора, как:

Constructor()
: initializer1(),
initializer2()

Согласно документация, Я пытался установить BreakConstructorInitializers в BeforeColon (в описании написано: «Разрывать инициализаторы конструктора перед двоеточием и после запятых», и это именно то, что я хочу), но это ставит разрыв перед запятой, а это не то, чего я хочу. Я делаю что-то не так или это ошибка в формате clang? Я попробовал оба clang-format-5.0 и clang-format-6.0, и они вели себя одинаково.

Вот мой полный файл в формате .clang:

---
Language:        Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands:   true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: All
AlwaysBreakAfterReturnType: TopLevel
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass:      true
AfterControlStatement: true
AfterEnum:       true
AfterFunction:   true
AfterNamespace:  true
AfterObjCDeclaration: true
AfterStruct:     true
AfterUnion:      true
BeforeCatch:     true
BeforeElse:      true
IndentBraces:    true
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: GNU
BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit:     140
CommentPragmas:  '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 4
Cpp11BracedListStyle: false
DerivePointerAlignment: false
DisableFormat:   false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: false
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeCategories:
- Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
Priority:        2
- Regex:           '^(<|"(gtest|gmock|isl|json)/)'
Priority:        3
- Regex:           '.*'
Priority:        1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: false
IndentWidth:     2
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
ReflowComments:  true
SortIncludes:    false
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles:  true
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard:        Cpp11
TabWidth:        8
UseTab:          Never
...

Я перепробовал все возможные комбинации BreakConstructorInitializersBeforeComma и BreakConstructorInitializers ключи; ни один из них не кажется тем, что я хочу.

Вот результаты:

BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
Constructor() : a(1), b(1)
{
}

BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeComma
Constructor()
: a(1)
, b(1)
{
}

BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
Constructor() : a(1), b(1)
{
}

BreakConstructorInitializersBeforeComma: true
BreakConstructorInitializers: BeforeColon
Constructor()
: a(1)
, b(1)
{
}

BreakConstructorInitializersBeforeComma: true
BreakConstructorInitializers: BeforeComma
Constructor()
: a(1)
, b(1)
{
}

BreakConstructorInitializersBeforeComma: true
BreakConstructorInitializers: AfterColon
Constructor() : a(1), b(1)
{
}

8

Решение

У меня та же проблема, что и у вас, и немного исследовал.

Итак, во-первых, BreakConstructorInitializers было изменено на enum, а BreakConstructorInitializersBeforeComma устарела. (https://reviews.llvm.org/D32479)

Когда я смотрю на то, что вы на самом деле хотели достичь, вы хотели BreakConstructorInitializersAFTERComma вместо этого, который не вещь. Вы можете достичь того, что вы хотите через ColumnLimitтолько с К сожалению.

2

Другие решения

Эти будут работать.

BreakConstructorInitializers: AfterColon
ConstructorInitializerAllOnOneLineOrOnePerLine: true

1