Странные отступы массива структур в формате clang в C ++

Я пытаюсь использовать clang-формат (в коде VS) для форматирования моих файлов C ++ и настройки его в соответствии с моим предпочтительным стилем. Для массива структур (для getopts) он добавляет нагрузку лишних пробелов и портит обертку скобок:

Я добавлю свой формат .clang в конец этого запроса.

Вот как я хочу, чтобы мой массив выглядел:

int main()
{
  const struct option longopts[]=
  {
    {"log-file", required_argument, 0, LOGFILE},
    {"log-level", required_argument, 0, LOGLEVEL},
    {nullptr, 0, nullptr, 0}
  };
}

Вот как это выглядит на самом деле:

int main()
{
  const struct option longopts[] =
      {
          {"log-file", required_argument, 0, LOGFILE},
          {"log-level", required_argument, 0, LOGLEVEL},
          {nullptr, 0, nullptr, 0}};
}

Мой файл в формате .clang содержит:

BasedOnStyle: LLVM
IndentWidth: 2
AlignAfterOpenBracket: Align
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortFunctionsOnASingleLine: true
AllowShortBlocksOnASingleLine: true
BinPackParameters: true
BreakBeforeBraces: Custom
BraceWrapping:
  AfterClass: true
  AfterControlStatement: true
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterObjCDeclaration: true
  AfterStruct: true
  AfterUnion: true
  AfterExternBlock: true
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false
BreakConstructorInitializers: AfterColon
ColumnLimit: 0
ConstructorInitializerAllOnOneLineOrOnePerLine: false
IndentCaseLabels: true
KeepEmptyLinesAtTheStartOfBlocks: true
NamespaceIndentation: All
PointerAlignment: Right
SortIncludes: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: Never
SpaceInEmptyParentheses: false
SpacesInContainerLiterals: false
SpacesInAngles: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
UseTab: Never

Любые решения приветствуются!


person Phil Evans    schedule 24.01.2019    source источник


Ответы (1)


Я не уверен, что именно то, что вы хотите, может быть достигнуто, но иногда проще всего слегка изменить исходный файл, чтобы помочь утилите clang-format. Сначала вам нужно добавить параметр ContinuationIndentWidth: 2 в файл формата. Затем добавьте запятую после последнего элемента в массиве:

{nullptr, 0, nullptr, 0}, // <---

И, наконец, переместите первую фигурную скобку в ту же строку, что и имя массива. Полученный файл будет таким:

int main()
{
  const struct option longopts[] = {
    {"log-file", required_argument, 0, LOGFILE},
    {"log-level", required_argument, 0, LOGLEVEL},
    {nullptr, 0, nullptr, 0},
  };
}

Запуск clang-формата оставит все как есть. Протестировано в формате clang из сборки моментального снимка LLVM LLVM-9.0.0-r351376-win64.exe.

person αλεχολυτ    schedule 24.01.2019
comment
Спасибо! Как вы говорите, не совсем идеально из-за того, где заканчивается открывающая скобка, но намного лучше, чем было! - person Phil Evans; 24.01.2019