Как сделать автоматический отступ в классе C ++ с 4 пробелами, используя clang-формат?

Я получил следующий файл в формате .clang в корневом каталоге моего проекта:

---
AlignTrailingComments: true
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
BreakBeforeBinaryOperators: false
IndentWidth: 4
SortIncludes: false
NamespaceIndentation: All
...

Проблема возникает, когда я запускаю clang-format на моих заголовках c ++, классы автоматически индентируются следующим образом:

введите описание изображения здесь

Как видите, ярлыки публичные & частные отступы только с 2 пробелами. Но я пытаюсь добиться следующих результатов (отступ был настроен вручную):

введите описание изображения здесь

Таким образом, свертывание кода становится чем-то действительно приятным.

Как я могу настроить мой .clang-формат для достижения этого эффекта? Если это невозможно, как бы вы исправили исходный код в формате clang для достижения желаемого поведения?

РЕДАКТИРОВАТЬ:

Я попытался использовать AccessModifierOffset безуспешно, я использовал значения {-2,0,2,4} пример ниже:

введите описание изображения здесь

Как вы можете видеть, оператор внутри публичного блока не будет иметь правильного отступа.

EDIT2:

Я пробовал решение @Henrique Jung, и это определенно не то, о чем я прошу, если при использовании этой комбинации результат будет примерно таким:

введите описание изображения здесь

И, как вы можете видеть, содержимое внутри функций имеет отступ с 8 пробелами вместо 4, что не очень хорошо.

EDIT3:

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

21

Решение

Насколько я могу судить, clang-формат не предлагает опции для отступа содержимого функции в отличие от содержимого класса без модификатора доступа. То есть рассмотрим следующий код:

class A {
public:
void foo() {}
}

void bar() {
int a;
}

В этом коде строка «void foo () {}» всегда будет иметь отступ с той же величиной, что и «int a;» по clang-формату.

Ближе всего к стилю, который вам, по-видимому, нужен, можно придумать отсутствие отступов модификаторов доступа, например:

class A {
public:
void foo() {}
}

void bar() {
int a;
}

Это делается, например, стилями WebKit, Mozilla и LLVM. Это достигается установкой:

IndentWidth: 4
AccessModifierOffset: -4
2

Другие решения

Мне удалось добиться желаемого эффекта, изменив оба AccessModifierOffset с IndentWidth. По сути, первое используется как смещение второго, так что если вы создаете .лязг-формат вот так вы получаете то, что хотите:

AccessModifierOffset: -4
IndentWidth:     8

Если AccessModifierOffset 0, public ключевое слово будет на том же уровне отступа, что и члены. Тем не менее, изменение IndentWidth будет отступать весь код на 8 пробелов, даже те, которые находятся вне объявления класса. Это пример кода:

class Foo {
public:
Foo();
virtual ~Foo(); };

int main(int argc, char *argv[]) {
std::cout << "Hello world" << std::endl;
return 0;
}
0

Я столкнулся с теми же проблемами, и нашел, что самое быстрое решение — сделать копию настройки по умолчанию для clang (найденной предпочтение -> Настройки пакета -> Clang Format -> Пользовательский стиль по умолчанию) в пользовательские настройки пользователя (предпочтение -> Настройки пакета -> Clang Format -> Пользовательский стиль — Пользователь), затем раскомментируйте и измените некоторые параметры по своему усмотрению. Например:

"ColumnLimit": 119,
// Indent width for line continuations.
"ContinuationIndentWidth": 4,
// The number of columns to use for indentation.
"IndentWidth": 4,
"TabWidth": 4,
"UseTab": "Never"
0
По вопросам рекламы [email protected]