Как получить расширение Visual Studio 2015 в формате clang, чтобы не ставить фигурные скобки в той же строке, что и оператор if

С моей точки зрения, для любого языка, для которого фигурные скобки необязательны, размещение фигурных скобок на той же строке, что и оператор if, нежелательно. Рассмотрим следующее.

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

Если фигурная скобка находится в конце оператора if, мне нужно искать и нажимать клавишу конца только для того, чтобы определить, где заканчивается этот блок кода. Я ненавижу это делать. Я ищу и клею машинистку с плохим зрением, и мне требуется немало усилий, чтобы найти этот конечный ключ, чтобы я мог узнать, где заканчивается этот блок кода.

Я пытаюсь использовать clang-format, используя расширение ClangFormat Visual Studio 2015, но я настаиваю на том, чтобы фигурные скобки не помещались в ту же строку, что и 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.


person Ben Key    schedule 19.04.2017    source источник
comment
Я думаю, что следующая ошибка может иметь какое-то отношение к моей проблеме: bugs.llvm.org //show_bug.cgi?id=25069.   -  person Ben Key    schedule 19.04.2017


Ответы (1)


Оказывается, мои проблемы были вызваны тем, что у меня было установлено значение true для параметров AllowShortLoopsOnASingleLine и AllowShortBlocksOnASingleLine.

Об этой проблеме сообщалось как ошибка 25069 (изменение поведения BreakBeforeBraces формата clang с Allow...OnASingleLine параметрами)< /а>.

В итоге я использовал следующий файл формата .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
...
person Ben Key    schedule 25.04.2017