Подтвердить что ты не робот

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

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

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

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

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

Как вы можете видеть, метки public и private имеют отступы только с двумя пробелами. Но то, что я пытаюсь достичь, - это результат ниже (отступ был вручную изменен):

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

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

Как я могу настроить мой .clang-формат для достижения этого эффекта?

EDIT:

Я попытался использовать unsuccesfully AccessModifierOffset, я использовал значения {-2,0,2,4} экзамен ниже:

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

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

EDIT2:

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

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

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

EDIT3:

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

4b9b3361

Ответ 1

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

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;
}

Ответ 2

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

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

void bar() {
    int a;
}

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

Ближайшая вещь к стилю, который вы, похоже, хотите, который доступен, исходит из не отступающих модификаторов доступа, например:

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

void bar() {
    int a;
}

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

IndentWidth: 4
AccessModifierOffset: -4