Какой с помощью clang-format сделать перенос в столбик

Вот мой .clang-format файл

---
Language: Cpp
BasedOnStyle: Google
AccessModifierOffset: 2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: Right
AlignConsecutiveAssignments: AcrossEmptyLines
AlignConsecutiveBitFields: AcrossEmptyLines
AlignConsecutiveDeclarations: AcrossEmptyLines
AlignConsecutiveMacros: AcrossEmptyLines
AlignEscapedNewlines: Right
AlignOperands: Align 
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: InlineOnly 
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: []
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: false
  AfterClass: false
  AfterControlStatement: Never 
  AfterEnum: false
  AfterFunction: false
  AfterNamespace: false
  AfterStruct: false
  AfterUnion: false
  AfterExternBlock: false
  BeforeCatch: false
  BeforeElse: false
  BeforeLambdaBody: false
  BeforeWhile: false
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: AfterColon 
BreakStringLiterals: true
ColumnLimit: 120
CompactNamespaces: true
ContinuationIndentWidth: 2
Cpp11BracedListStyle: true
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: Always
FixNamespaceComments: true
ForEachMacros: []
IfMacros: []
IncludeBlocks: Regroup
IndentAccessModifiers: true
IndentCaseBlocks: false
IndentCaseLabels: true
#IndentExternBlock: AfterExternBlock
IndentPPDirectives: BeforeHash
IndentRequires: true
IndentWidth: 2
IndentWrappedFunctionNames: true
InsertTrailingCommas: Wrapped
LambdaBodyIndentation: Signature
#Language: Cpp
MacroBlockBegin: ""
MacroBlockEnd: ""
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
NamespaceMacros: []
PackConstructorInitializers: Never
PointerAlignment: Left
QualifierAlignment: Left
#QualifierOrder: ['inline', 'static', 'type', 'const', 'volatile' ]
ReferenceAlignment: Left
ReflowComments: True
ShortNamespaceLines: 10
SortIncludes: CaseInsensitive
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatementsExceptControlMacros
SpaceBeforeRangeBasedForLoopColon: false
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: c++17
StatementAttributeLikeMacros: [MI, STD, STC, PH, IMPL, MI_CONSTEXPR_20, PMR, CT]
StatementMacros: []
TabWidth: 2
TypenameMacros: []
UseCRLF: true
UseTab: Never
WhitespaceSensitiveMacros: []
---

Я пытаюсь настроить перенос, чтобы он сохранял моё форматирование, если я сам изменил перенос

Было:

MI_NODISCARD bool is_naked_whiscers(const MI PseudoDynamicArray<MI global_index, 3>& ar) {
      //...

      return static_cast<size_t>(ar[0]) < n_vertices_on_start() && static_cast<size_t>(ar[1]) < n_vertices_on_start() && static_cast<size_t>(ar[2]) < n_vertices_on_start();
    }

Стало:

MI_NODISCARD bool is_naked_whiscers(const MI PseudoDynamicArray<MI global_index, 3>& ar) {
      //...

      return static_cast<size_t>(ar[0]) < n_vertices_on_start() && 
             static_cast<size_t>(ar[1]) < n_vertices_on_start() &&
             static_cast<size_t>(ar[2]) < n_vertices_on_start();
    }

Но clang-format меняет это на следующее:

MI_NODISCARD bool is_naked_whiscers(const MI PseudoDynamicArray<MI global_index, 3>& ar) {
      //...

      return static_cast<size_t>(ar[0]) < n_vertices_on_start() && static_cast<size_t>(ar[1]) < n_vertices_on_start() &&
             static_cast<size_t>(ar[2]) < n_vertices_on_start();
    }

Ответы (1 шт):

Автор решения: Ariox

Вы можете использовать

// clang-format off  
// clang-format on

Но это очень неудобно.

Я предпочитаю просто оставлять пустые комментарии в конце строки, clang-format не может их удалить:

return static_cast<size_t>(ar[0]) < n_vertices_on_start() && //
       static_cast<size_t>(ar[1]) < n_vertices_on_start() && //
       static_cast<size_t>(ar[2]) < n_vertices_on_start();   //

Обычно достаточно только первого комментария, но тогда код выглядит не очень хорошо, и коллеги периодически удаляют "лишние" символы.

Также рекомендую запретить форматирование специфичных комментариев при помощи строки CommentPragmas: '(\\.+|@.+|\[.*\]|\(.*\)|\{.*\})'

Можно поставить другую регулярку, конкретно эту я использую, чтобы не переносились строки с doxygen - комментариями и markdown ссылки.

→ Ссылка