Как автоматически отступать класс С++ с 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 рассмотрят этот вопрос и дадут некоторые предложения.
Ответы
Ответ 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