Параметри стилю clang-format
Параметри стилю clang-format
описують налаштовувані параметри стилю форматування, що підтримуються LibFormat
та ClangFormat
.
Використовуючи утиліту командного рядка clang-format або функції clang::format::reformat(...)
з коду, можна або використовувати один із заздалегідь визначених стилів ( LLVM
, Google
, Chromium
, Mozilla
, WebKit
, Microsoft
) або створити власний стиль шляхом налаштування конкретних параметрів стилю.
Налаштування стилю clang-format
clang-format підтримує два способи надання власних параметрів стилю: безпосередньо вкажіть конфігурацію стилю в опції командного рядка -style = або використовуйте файл -style = та додайте конфігурацію стилю у файл .clang-формату або _clang-формату у каталозі проекту.
Файл .clang-format
використовує синтакисис yaml
:
key1: value1
key2: value2
# коментар
Приклад файла конфігурації для кількох мов
---
# Ми використовуємо за замовчуванням LLVM стиль, але ...
BasedOnStyle: LLVM
# з відступом 4
IndentWidth: 4
---
# Для мови програмування C++
Language: Cpp
# Примусові вказівники на тип
DerivePointerAlignment: false
PointerAlignment: Left
---
# для JavaScript
Language: JavaScript
# обмежуємо довжину рядка до 100 символів
ColumnLimit: 100
---
# .proto файли
Language: Proto
# автоматично форматувати не будемо
DisableFormat: true
---
# Для C#
Language: CSharp
# використовуємо обмеження довжини рядка
ColumnLimit: 100
...
Вимкнення форматування для фрагменту коду
Clang-format розуміє також спеціальні коментарі, які вимикають форматування на обраному форагменты коду. Код між коментарями // clang-format off
або /* clang-format off */
та // clang-format on
та /* clang-format on */
не буде форматуватися. Коментарі будуть відформатовані (вирівняні) у звичайному режимі.
int formatted_code;
// clang-format off
void unformatted_code ;
// clang-format on
void formatted_code_again;
Конфігурація стилю у коді
Настроювані параметри стилю формату
У цьому розділі перелічені підтримувані параметри стилю. Тип значення вказаний для кожного варіанту. Для типів перерахування можливі значення вказуються як як елемент переліку C++ (з префіксом, наприклад LS_Auto
), так і як значення, яке можна використовувати в конфігурації (без префікса: Auto
).
BasedOnStyle (string)
Стиль, який використовується для всіх параметрів, не вказаних у конфігурації.
Цей параметр підтримується лише у конфігурації формату clang (як у межах -style = '{...}'
, так і у файлі .clang-format
).
Можливі значення:
LLVM
cтиль, що відповідає LLVM coding standardsGoogle
cтиль, що відповідає Google’s C++ style guideChromium
cтиль, що відповідає Chromium’s style guideMozilla
cтиль, що відповідає Mozilla’s style guideWebKit
cтиль, що відповідає WebKit’s style guideMicrosoft
cтиль, що відповідає Microsoft’s style guideGNU
cтиль, що відповідає GNU coding standards
BasedOnStyle: Google
AccessModifierOffset (int)
Додатковий відступ або відступ модифікаторів доступу, напр. public:
.
AccessModifierOffset: 2
AlignAfterOpenBracket (BracketAlignmentStyle)
Якщо true
, горизонтально вирівнює аргументи після відкритої дужки.
Це стосується круглих дужок ()
, кутових дужок <>
та квадратних дужок []
.
Можливі значення:
BAS_Align
(у конфігурації:Align
) Вирівняти параметри на відкритій дужці, наприклад:
void someLongFunction(argument1,
argument2);
BAS_DontAlign
(у конфігурації:DontAlign
) Не вирівнювати, замість цього використовуйтеContinuationIndentWidth
, наприклад:
void someLongFunction(argument1,
argument2);
BAS_AlwaysBreak
(у конфігурації:AlwaysBreak
) Завжди розривати після відкритої дужки, якщо параметри не вміщуються в один рядок, наприклад:
void someLongFunction(
argument1, argument2);
AlignConsecutiveAssignments (bool)
Якщо true
, вирівнює послідовні призначення.
Це вирівняє оператори присвоєння послідовних рядків. Це призведе до форматування виду:
int aaaa = 12;
int b = 23;
int ccc = 23;
AlignConsecutiveBitFields (bool)
Якщо true
, вирівнює послідовних членів бітового поля.
Це вирівняє роздільники розрядних полів послідовних рядків. Це призведе до форматування виду:
int aaaa : 1;
int b : 12;
int ccc : 8;
AlignConsecutiveDeclarations (bool)
Якщо true
, вирівнює послідовні декларації.
Це вирівняє назви оголошень послідовних рядків. Це призведе до форматування виду:
int aaaa = 12;
float b = 23;
std::string ccc = 23;
AlignConsecutiveMacros (bool)
Якщо значення true
, вирівнює послідовні макроси препроцесора C/C++
.
Це вирівняє макроси препроцесора C/C++
послідовних рядків. Це призведе до форматування виду:
#define SHORT_NAME 42
#define LONGER_NAME 0x007f
#define EVEN_LONGER_NAME (2)
#define foo(x) (x * x)
#define bar(y, z) (y + z)
AlignEscapedNewlines (EscapedNewlineAlignmentStyle)
Варіанти вирівнювання зворотних скісних рисок у рядах, що відключаються.
Можливі значення:
ENAS_DontAlign
(у конфігурації:DontAlign
) Не вирівнювати екрановані нові рядки.
#define A \
int aaaa; \
int b; \
int dddddddddd;
ENAS_Left
(у конфігурації:Left
) Вирівняти екрановані нові рядки якомога далі ліворуч.
true:
#define A \
int aaaa; \
int b; \
int dddddddddd;
false:
ENAS_Right
(у конфігурації:Right
) Вирівнювання екранованих рядків у крайньому правому стовпці.
#define A \
int aaaa; \
int b; \
int dddddddddd;
AlignOperands (OperandAlignmentStyle)
Якщо true
, горизонтально вирівняйте операнди бінарних та тернарних виразів.
Можливі значення:
OAS_DontAlign
(у конфігурації:DontAlign
) Не вирівнювати операнди бінарних та тернарних виразів. Обернуті рядки мають відступиContinuationIndentWidth
пробіли від початку рядка.OAS_Align
(у конфігурації:Align
) Горизонтально вирівнює операнди бінарних та тернарних виразів.
Зокрема, це вирівнює операнди одного виразу, який потрібно розділити на кілька рядків, наприклад:
int aaa = bbbbbbbbbbbbbbb +
ccccccccccccccc;
Коли встановлено BreakBeforeBinaryOperators
, обернутий оператор вирівнюється з операндом у першому рядку.
int aaa = bbbbbbbbbbbbbbb
+ ccccccccccccccc;
OAS_AlignAfterOperator
(у конфігурації:AlignAfterOperator
) Горизонтально вирівнюйте операнди бінарних та тернарних виразів.
Це схоже на AO_Align
, крім випадків, коли встановлено BreakBeforeBinaryOperators
, оператор не має відступу, щоб загорнутий операнд вирівнювався з операндом у першому рядку.
int aaa = bbbbbbbbbbbbbbb
+ ccccccccccccccc;
AlignTrailingComments (bool)
Якщо true
, вирівнює кінцеві коментарі.
true:
int a; // My comment a
int b = 2; // comment b
// vs
false:
int a; // My comment a
int b = 2; // comment about b
AllowAllArgumentsOnNextLine (bool)
Якщо виклик функції або списковий ініціалізатор не вміщується у рядок, дозволяє розміщувати всі аргументи в наступному рядку, навіть якщо BinPackArguments
хибний.
true:
callFunction(
a, b, c, d);
false:
callFunction(a,
b,
c,
d);
AllowAllConstructorInitializersOnNextLine (bool)
Якщо визначення конструктора зі списком ініціалізатора-члена не вміщується в одному рядку, дозволяє розмістити всі члени-ініціалізатори в наступному рядку, якщо ConstructorInitializerAllOnOneLineOrOnePerLine
має значення true
. Зауважте, що цей параметр не впливає, якщо значення ConstructorInitializerAllOnOneLineOrOnePerLine
встановлено false
.
true:
MyClass::MyClass() :
member0(0), member1(2) {}
false:
MyClass::MyClass() :
member0(0),
member1(2) {}
AllowAllParametersOfDeclarationOnNextLine (bool)
Якщо оголошення функції не вміщується в рядку, дозволяє помістити всі параметри оголошення функції в наступний рядок, навіть якщо BinPackParameters
встановлено false
.
true:
void myFunction(
int a, int b, int c, int d, int e);
false:
void myFunction(int a,
int b,
int c,
int d,
int e);
AllowShortBlocksOnASingleLine (ShortBlockStyle)
Залежно від значення, while (true) { continue; }
можна поставити в один рядок.
Можливі значення:
SBS_Never
(у конфігурації:Never
) Ніколи не об’єднуйте блоки в один рядок.
while (true) {
}
while (true) {
continue;
}
SBS_Empty
(у конфігурації:Empty
) Об’єднувати лише порожні блоки.
while (true) {}
while (true) {
continue;
}
SBS_Always
(у конфігурації:Always
) Завжди об’єднуйте короткі блоки в один рядок.
while (true) {}
while (true) { continue; }
AllowShortCaseLabelsOnASingleLine (bool)
Якщо true
, короткі мітки будуть стискатися в один рядок.
true:
switch (a) {
case 1: x = 1; break;
case 2: return;
}
// vs.
false:
switch (a) {
case 1:
x = 1;
break;
case 2:
return;
}
AllowShortEnumsOnASingleLine (bool)
Дозволити короткі переліки в одному рядку.
true:
enum { A, B } myEnum;
false:
enum
{
A,
B
} myEnum;
AllowShortFunctionsOnASingleLine (ShortFunctionStyle)
Залежно від значення, int f () {return 0; }
можна поставити в один рядок.
Можливі значення:
SFS_None
(у конфігурації:None
) Ніколи не об’єднуйте функції в один рядок.SFS_InlineOnly
(у конфігурації:InlineOnly
) Лише функції злиття, визначені всередині класу. Те саме, що і “вбудований”, за винятком того, що це не означає “порожній”: тобто порожні функції верхнього рівня також не об’єднуються.
class Foo {
void f() { foo(); }
};
void f() {
foo();
}
void f() {
}
SFS_Empty
(у конфігурації:Empty
) Об’єднати лише порожні функції.
void f() {}
void f2() {
bar2();
}
SFS_Inline
(у конфігурації:Inline
) Лише функції злиття, визначені всередині класу. Мається на увазі “порожній”.
class Foo {
void f() { foo(); }
};
void f() {
foo();
}
void f() {}
SFS_All
(у конфігурації:All
) Об’єднати всі функції, що розміщуються в одному рядку.
class Foo {
void f() { foo(); }
};
void f() { bar(); }
AllowShortIfStatementsOnASingleLine (ShortIfStyle)
Якщо true
, if (a) return;
можна поставити в один рядок.
Можливі значення:
SIS_Never
(у конфігурації:Never
) Ніколи не ставте короткі if’и на одному рядку.
if (a)
return ;
else {
return;
}
SIS_WithoutElse
(у конфігурації:WithoutElse
) Без інакшого ставити короткі if’и в тому ж рядку, лише якщоelse
не є складеним оператором.
if (a) return;
else
return;
SIS_Always
(у конфігурації:Always
) Завжди ставіть короткі if’и в одному рядку, якщоelse
не є складеним твердженням чи ні.
if (a) return;
else {
return;
}
AllowShortLambdasOnASingleLine (ShortLambdaStyle)
Залежно від значення, auto lambda [] () {return 0; }
можна поставити в один рядок.
Можливі значення:
=======================
int aaaa : 1;
int b : 12;
int ccc : 8;
Приклади
Стиль який симулює Linux Kernel style
BasedOnStyle: LLVM
IndentWidth: 8
UseTab: Always
BreakBeforeBraces: Linux
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
Результат (уявіть, що тут для відступу використовуються табуляція):
void test()
{
switch (x) {
case 0:
case 1:
do_something();
break;
case 2:
do_something_else();
break;
default:
break;
}
if (condition)
do_something_completely_different();
if (x == y) {
q();
} else if (x > y) {
w();
} else {
r();
}
}
Стиль, подібний до стилю форматування Visual Studio
за замовчуванням:
UseTab: Never
IndentWidth: 4
BreakBeforeBraces: Allman
AllowShortIfStatementsOnASingleLine: false
IndentCaseLabels: false
ColumnLimit: 0
Результат:
void test()
{
switch (suffix)
{
case 0:
case 1:
do_something();
break;
case 2:
do_something_else();
break;
default:
break;
}
if (condition)
do_somthing_completely_different();
if (x == y)
{
q();
}
else if (x > y)
{
w();
}
else
{
r();
}
}