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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


person BPL    schedule 15.03.2017    source источник
comment
попробуйте AccessModifierOffset. Это возможное дублирование другого вопроса SO: stackoverflow.com/questions/29198963/   -  person caoanan    schedule 29.03.2017
comment
@caoanan Не совсем, я уже пробовал AccessModifierOffset несколько дней назад, и по какой-то причине он не выполняет правильные отступы для классов. Хотя это правда, что он будет делать отступы для общедоступных / частных / защищенных, он не делает отступы для операторов под ними. Пожалуйста, взгляните на мой вопрос, я привел вам пример   -  person BPL    schedule 29.03.2017
comment
Эх, если бы я только мог вставить сюда скриншот . Похоже, вам нравятся настройки стиля Webkit.   -  person Hans Passant    schedule 28.10.2017


Ответы (3)


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

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

void bar() {
    int a;
}

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

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

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

void bar() {
    int a;
}

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

IndentWidth: 4
AccessModifierOffset: -4
person Kimby    schedule 31.10.2017

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

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;
}
person Henrique Jung    schedule 03.04.2017
comment
Спасибо за ответ, но это определенно не то, о чем я прошу, я отредактировал свой ответ, чтобы объяснить, почему ... посмотрите инструкции std :: cout и return 0, они имеют отступ 8 пробелов вместо 4, я хочу 4. - person BPL; 03.04.2017
comment
Да, я знал, что есть побочный эффект, но не смог найти конкретную переменную отступа для членов. - person Henrique Jung; 03.04.2017

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

"ColumnLimit": 119,
// Indent width for line continuations.
"ContinuationIndentWidth": 4,
// The number of columns to use for indentation.
"IndentWidth": 4,
"TabWidth": 4,
"UseTab": "Never"
person ouxiaogu    schedule 19.09.2018