clang-format: разрыв перед фигурными скобками для лямбда-функций и блоков extern

У меня есть лямбда-функция в таком формате:

auto cb = [](std::string const& _param)
{
    std::cout << _param;
};

Я хотел бы сохранить открывающую скобку на новой строке, но clang-format всегда помещает ее в конец первой строки. Можно ли настроить clang-format в соответствии с указанным выше стилем?

Соответствующая часть моей текущей конфигурации выглядит так:

BraceWrapping:                         
  AfterClass:      true   
  AfterControlStatement: true
  AfterEnum:       true
  AfterFunction:   true          
  AfterNamespace:  true                
  AfterStruct:     true
  AfterUnion:      true
  BeforeCatch:     true
  BeforeElse:      true   
  IndentBraces:    true
BreakBeforeBraces: Allman

Я бы тоже хотел сделать то же самое для extern блоков:

extern "C"
{
  // ...
}

person Federico B.    schedule 17.05.2017    source источник
comment
Какую версию clang-format вы используете? Это может быть ошибка: mail-archive.com/ [email protected]/msg05471.html   -  person syntagma    schedule 17.05.2017
comment
Я использую версию 5.0.0 (теги / google / stable / 2017-03-17)   -  person Federico B.    schedule 17.05.2017
comment
Я только что нашел отчеты об ошибках, отслеживающие проблему с лямбдами bugs.llvm.org//show_bug. cgi? id = 32151 и extern блокируют bugs.llvm.org// show_bug.cgi? id = 26689   -  person Federico B.    schedule 17.05.2017
comment
Я считаю, что все ваши значения BraceWrapping игнорируются, если для BreakBeforeBraces не установлено значение Custom.   -  person David Vereb    schedule 07.06.2017
comment
Я считаю, что более связанный с ним bugs.llvm.org/show_bug.cgi?id=27640   -  person Mikhail    schedule 05.10.2017


Ответы (2)


Кажется, это решается с помощью BeforeLambdaBody, введенного в формате clang 11.

person Jakub Jeziorski    schedule 05.05.2020

Я не думаю, что есть вариант для этого конкретного случая. Прошу прощения, если вы не считаете это ответом, но когда у меня возникают проблемы с "тонкой настройкой" с clang-format, я просто форматирую фрагмент так, как хочу, и комментирую clang-format off непосредственно перед интересным фрагментом и clang-format on сразу после него. Я часто делаю это, чтобы сохранить некоторую пустую последовательность символов, используемую для выравнивания кода для лучшего чтения. В результате, конечно же, CF не изменит этот фрагмент. Итак, ваш код может быть

// clang-format off
auto cb = [](std::string const& _param)
{
    std::cout << _param;
};
// clang-format on
person Elvis Teixeira    schedule 03.01.2018