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

BPL*_*BPL 24 c++ indentation auto-indent clang-format

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

---
AlignTrailingComments: true
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
BreakBeforeBinaryOperators: false
IndentWidth: 4
SortIncludes: false
NamespaceIndentation: All
...
Run Code Online (Sandbox Code Playgroud)

当我在我的c ++标题上运行clang-format时出现问题,类会自动缩进,如下所示:

在此输入图像描述

如您所见,标签public和private仅缩进2个空格.但我想要实现的是下面的输出(缩进是手动调整):

在此输入图像描述

这样,代码崩溃变得非常愉快.

我怎么能调整我的.clang格式才能达到这个效果?如果不可能,你将如何修补clang格式的源代码来实现这种期望的行为?

编辑:

我尝试过使用AccessModifierOffset失败,我使用了以下值{-2,0,2,4}:

在此输入图像描述

如您所见,公共块内的语句将不会正确缩进.

EDIT2:

我已经尝试了@Henrique Jung解决方案,这绝对不是我要求的,如果使用这种组合,结果将是这样的:

在此输入图像描述

正如您所看到的,函数内部缩进了8个空格而不是4个,这并不好.

EDIT3:

几个月前我给了赏金,所以我要再试一次,因为这个肯定很有趣.如果我对俚语格式的源代码有足够的了解,我会试一试,不幸的是我没有.

小智 7

据我所知,clang-format 没有提供与非访问修饰符类内容不同的缩进功能内容的选项。也就是说,请考虑以下代码:

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

void bar() {
    int a;
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,“void foo() {}”行将始终缩进与“int a;”相同的数量。通过 clang 格式。

与您似乎想要的样式最接近的是不缩进访问修饰符,例如:

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

void bar() {
    int a;
}
Run Code Online (Sandbox Code Playgroud)

例如,这是通过 WebKit、Mozilla 和 LLVM 样式完成的。它是通过设置实现的:

IndentWidth: 4
AccessModifierOffset: -4
Run Code Online (Sandbox Code Playgroud)


Jur*_*rza 5

由于您已经设置IndentWidth: 4并基于手动调整缩进的图像,因此您需要将这些添加到 .clang-format 中:

AccessModifierOffset: 0
IndentAccessModifiers: true
Run Code Online (Sandbox Code Playgroud)

请记住,clang-format-13使用选项时不需要或不需要IndentAccessModifiers

由于没有锚点,我无法直接链接它,但您应该IndentAccessModifiershttps://clang.llvm.org/docs/ClangFormatStyleOptions.html阅读更多信息


Hen*_*ung 1

我通过更改AccessModifierOffsetIndentWidth设法实现了您想要的效果。基本上,第一个用作第二个的偏移量,所以如果您像这样创建.clang-format,您会得到您想要的:

AccessModifierOffset: -4
IndentWidth:     8
Run Code Online (Sandbox Code Playgroud)

如果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;
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但这绝对不是我想要的,我编辑了我的答案来解释原因...查看 std::cout 和 return 0 语句,它们缩进 8 个空格而不是 4 个,我想要4. (3认同)