如何使用clang-format自动缩进一个带有4个空格的C++类?

iyr7buue  于 2022-11-27  发布在  其他
关注(0)|答案(5)|浏览(449)

我在项目的根目录下得到了下一个. clang格式的文件:

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

当我在我的C++头文件上运行clang-format时,问题出现了,类变成了这样的自动缩进:

正如你所看到的,标签public & private只缩进了2个空格。但我尝试实现的是下面的输出(缩进是手动调整的):

这样,代码折叠就变成了一件非常愉快的事情。
我如何调整我的.clang-format来达到这个效果?如果不可能,你会如何修补clang-format源代码来达到这个期望的行为?
编辑:
我尝试使用AccessModifierOffset失败,我使用的值{-2,0,2,4}示例如下:

正如您所看到的,公共块中的语句将不会正确缩进。
编辑2:
我已经尝试了“亨里克·荣格”的解决方案,这绝对不是我想要的,如果使用这种组合,结果会是这样的:

正如你所看到的,函数中的内容缩进了8个空格,而不是4个,这是不好的。
编辑3:
几个月前我给了一个赏金,所以我打算再试一次,因为这个肯定很有趣。如果我有足够的关于clang格式源代码的知识,我会给予它一个机会,不幸的是我没有。

rkue9o1l

rkue9o1l1#

就我所知,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
oipij1gg

oipij1gg2#

我通过更改AccessModifierOffsetIndentWidth来实现您想要的效果。基本上,第一个用作第二个的偏移量,因此如果您像这样创建 .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;
}
8dtrkrch

8dtrkrch3#

我遇到了同样的问题,找到最快的解决办法就是复制一份clang默认设置(通过首选项-〉软件包设置-〉Clang格式-〉自定义样式-默认找到)添加到用户自定义设置中(首选项-〉包设置-〉Clang格式-〉自定义样式-用户),然后取消注解并将某些选项修改为您自己的首选项。例如:

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

aor9mmx14#

对于clang-format 13https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.0),您可以用途:

IndentAccessModifiers: true

以实现期望的行为。
如果您使用默认Visual Studio,它附带clang-format 12不支持此功能要使用它,请下载并安装clang-format 13,然后从Tools->Options->Text Editor->C/C++->Code Style->Formatting->General选中Use custom clang-format.exe file并选择clang format 13可执行文件

zpgglvta

zpgglvta5#

由于您已经设置了IndentWidth: 4,并且基于手动调整缩进的图像,您需要将以下内容添加到您的. clang-format中:

AccessModifierOffset: 0
IndentAccessModifiers: true

请记住,使用IndentAccessModifiers选项时需要使用clang-format-13或never。
由于没有锚,我不能直接链接它,但你应该在https://clang.llvm.org/docs/ClangFormatStyleOptions.html上阅读更多关于IndentAccessModifiers的内容

相关问题