How to auto indent a C++ class with 4 spaces using clang-format?

那年仲夏 提交于 2019-12-04 08:03:43

问题


I got the next .clang-format file in my project's root directory:

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

Problem comes when I run clang-format on my c++ headers, the classes become autoindented like this:

As you can see, labels public & private are indented only with 2 spaces. But what I'm trying to achieve is the below output (indentation was manually tweaked):

That way code-collapsing becomes something really pleasant to do.

How could I tweak my .clang-format to achieve this effect? If not possible, how would you patch clang-format source code to achieve this desired behaviour?

EDIT:

I've tried using unsuccessfully AccessModifierOffset, I've used values {-2,0,2,4} example below:

As you can see the statement inside the public block won't be indented properly.

EDIT2:

I've tried the @Henrique Jung solution and that's definitely not what I'm asking for, if using that combination the result would be something like this one:

And as you can see, the content inside the functions are indented 8 spaces instead 4, which is not good.

EDIT3:

I gave a bounty few months ago so I'm going to try again as this one is definitely interesting. If I got enough knowledge about clang-format source code I'd give it a shot, unfortunately I don't.


回答1:


As near as I can tell, clang-format offers no option for indenting function contents differently from non-access-modifier class contents. That is, consider the following code:

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

void bar() {
    int a;
}

In this code, the line "void foo() {}" will always be indented the same amount as "int a;" by clang-format.

The closest thing to the style you seem to want that is available would come from not indenting the access modifiers, e.g.:

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

void bar() {
    int a;
}

This is done, for example, by the WebKit, Mozilla, and LLVM styles. It's achieved by setting:

IndentWidth: 4
AccessModifierOffset: -4



回答2:


I managed to achieve the effect you want by changing both AccessModifierOffset with IndentWidth. Basically, the first is used as an offset of the second, so if you create your .clang-format like this you get what you want:

AccessModifierOffset: -4
IndentWidth:     8

If AccessModifierOffset is 0, the public keyword would be at the same level of indentation as the members. However, changing IndentWidth will indent all code by 8 spaces, even those outside the class declaration. This is a sample code:

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

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



回答3:


I met the same problems, and find the quickest solution is to make a copy of clang default setting(found by Preference -> Package Settings -> Clang Format -> Custom Style-Default) into the user custom setting(Preference -> Package Settings -> Clang Format -> Custom Style - User), then uncomment and modify some options into your own preference. For Example:

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


来源:https://stackoverflow.com/questions/42799183/how-to-auto-indent-a-c-class-with-4-spaces-using-clang-format

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!