如何使用 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】:我通过更改 AccessModifierOffset 和 IndentWidth 来实现您想要的效果。基本上,第一个用作第二个的偏移量,因此如果您像这样创建 .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->Options->Text Editor->C/C++->Code Style->Formatting->General
检查 Use custom clang-format.exe file
并选择 clang format 13
可执行文件。
【讨论】:
以上是关于如何使用 clang 格式自动缩进具有 4 个空格的 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章