Как заставить clang-format добавить новую строку перед тем, как открыть фигуру функции?

Я заинтересован в том, чтобы положить открытую фигуру для функций (но не для операторов и других контекстов). Например

   void foo()
   {
      ...
   }

Отбросы в сторону, есть ли хорошее обоснование для этого? Хотя я использую однострочные открытые скобки для if/else и меньших блоков, я думаю, что в этом случае визуальная организация больших единиц кода (функции/методы/классы/структуры) может добиться идеальной согласованности.

Кроме того, как мне получить стиль clang, чтобы следовать этому стилю?

Ответ 1

Как сообщает документация, вызовите clang-format с помощью -style=file и используйте файл .clang-format, размещенный в закрывающей директории, для настройки параметров стиля. Опция стиля формата, определяющая размещение скобок, называется BreakBeforeBraces. Из документов

BreakBeforeBraces (BraceBreakingStyle)

Стиль разрыва использовать.

Возможные значения:

  • BS_Attach (в конфигурации: Attach) Всегда привязывайте фигурные скобки к окружающему контексту.
  • BS_Linux (в конфигурации: Linux) Подобно Attach, но прерывайте перед фигурными скобками функции, пространства имен и определения классов.
  • BS_Stroustrup (в конфигурации: Stroustrup) Подобно Attach, но перерыв перед определениями функций и else.
  • BS_Allman (в конфигурации: Allman) Всегда прерывайте перед фигурными скобками.
  • BS_GNU (в конфигурации: GNU) Всегда прерывайте перед фигурными скобками и добавляйте дополнительный уровень отступов к фигурным скобкам контрольных операторов, а не к те из классов, функций или других определений.

Стиль, соответствующий вашему описанию, BS_Stroustrup. Добавьте следующую запись в .clang-format

BreakBeforeBraces: Stroustrup

В дополнение к документам clangformat.com перечислены все параметры и иллюстрируется многие из них примерами.

Ответ 2

Pradhan имеет отличный ответ, но вы можете обнаружить, что вы получаете перерывы, где вы не хотите их (как я нашел).

Существует еще один вариант "Custom", по крайней мере, в версиях 3.8 и 5 в стиле clang (я использую 3.8 и нашел BS_Custom в 5 документах). С этим вы можете указать в BraceWrapping то, что вы хотите, в том числе вариант "AfterFunction".

В следующем примере выдержки я перечислил другие как истинные/ложные, так как в вопросе ОП задается функция AfterFunction (т.е. "перед открытием скобки функции" ):

BraceWrapping:
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true/false
  AfterFunction:   true
  AfterNamespace:  true/false
  AfterObjCDeclaration: true/false
  AfterStruct:     true/false
  AfterUnion:      true/false
  BeforeCatch:     true/false
  BeforeElse:      true/false
  IndentBraces:    true/false
BreakBeforeBraces: Custom

Я тестировал это с моей конфигурацией, и он дает более тонкий контроль за разрывом брекета.