如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?

Posted

技术标签:

【中文标题】如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?【英文标题】:How to auto indent a C++ class with 4 spaces using clang-format? 【发布时间】:2017-08-05 13:37:21 【问题描述】:

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

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

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

如您所见,公共和私人标签仅缩进 2 个空格。但我想要实现的是以下输出(缩进是手动调整的):

这样,代码折叠变得非常愉快。

我如何调整我的 .clang 格式来实现这种效果?如果不可能,您将如何修补 clang 格式的源代码以实现这种期望的行为?

编辑:

我尝试使用不成功的 AccessModifierOffset,我使用了值 -2,0,2,4 下面的示例:

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

EDIT2:

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

如您所见,函数内部的内容缩进了 8 个空格而不是 4 个空格,这不好。

EDIT3:

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

【问题讨论】:

尝试“AccessModifierOffset”。这可能是另一个 SO 问题的重复:***.com/questions/29198963/… @caoanan 不是真的,几天前我已经尝试过 AccessModifierOffset 并且由于某种原因它没有正确缩进类。虽然它确实会缩进 public/private/protected,但它并没有缩进它们下面的语句。请看我的问题,我给你举了一个例子 呃,如果我能粘贴截图into this就好了。看来您喜欢 Webkit 样式设置。 【参考方案1】:

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

class A 
  public:
    void foo() 


void bar() 
    int a;

在这段代码中,“void foo() ”行的缩进量总是与“int a;”相同。通过 clang 格式。

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

class A 
public:
    void foo() 


void bar() 
    int a;

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

IndentWidth: 4
AccessModifierOffset: -4

【讨论】:

【参考方案2】:

我通过更改 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;

【讨论】:

感谢您的回答,但这绝对不是我要的,我已经编辑了我的答案来解释为什么...查看 std::cout 并返回 0 个语句,它们是缩进 8 个空格而不是 4 个,我想要 4 个。 是的,我知道有副作用,但是我找不到成员的特定缩进变量。【参考方案3】:

我遇到了同样的问题,找到最快的解决方案是复制 clang 默认设置(通过 Preference -> Package Settings -> Clang Format -> Custom Style-Default)进入用户自定义设置(Preference -> Package Settings -> Clang 格式 -> 自定义样式 - 用户),然后取消注释并将一些选项修改为您自己的偏好。例如:

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

【讨论】:

【参考方案4】:

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

IndentAccessModifiers: true

实现所需的行为。

如果您使用默认的 Visual Studio,它带有不支持此功能的 clang-format 12。要使用它,请下载并安装 clang-format 13 并从 Tools-&gt;Options-&gt;Text Editor-&gt;C/C++-&gt;Code Style-&gt;Formatting-&gt;General 检查 Use custom clang-format.exe file 并选择 clang format 13 可执行文件。

【讨论】:

以上是关于如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章

关于VSCode如何缩进两个空格

如何修复/转换 Sublime Text 中的空格缩进?

vscode 代码缩进为4个空格

vscode 代码缩进为4个空格

vscode 代码缩进为4个空格

具有 4 个空格缩进的 Vue-CLI