Как заставить 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
Я тестировал это с моей конфигурацией, и он дает более тонкий контроль за разрывом брекета.