在C++ VSCode中将花括号格式化为同一行

145

我正在使用C++扩展来进行VSCode (Visual Studio Code)编程。

目前,我的设定为"C_Cpp.clang_format_formatOnSave"被设置为true

当我保存C++文件时,这将格式化我的代码。但是该格式会使花括号放在新行上,而不是在同一行上。

当前C++ VSCode格式化结果如下

for (int i = 0; i < 10; i++)
{
    // ...
}

我希望C++ VSCode格式化后的代码看起来像什么

for (int i = 0; i < 10; i++) {
    // ...
}

我也将 editor.wrappingIndent 设置为"same"

如何在Visual Studio Code中使C ++格式的花括号在同一行上?


1
可能是VS Code格式化"{ }"的重复问题 - Adriano P
11个回答

259
  1. 进入设置 -> 首选项
  2. 搜索 C_Cpp.clang_format_fallbackStyle
  3. 点击编辑,复制到设置中
  4. 将 "Visual Studio" 更改为 "{ BasedOnStyle: Google, IndentWidth: 4 }"

例如:

  • "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 0}"
  • 顺便提一下,ColumnLimit: 0 也很有用,因为 google 的列限制会在不需要的时候将你的代码断成下一行。

如果需要更多信息:

更详细的说明:

英文:https://medium.com/@zamhuang/vscode-how-to-customize-c-s-coding-style-in-vscode-ad16d87e93bf

台湾:https://medium.com/@zamhuang/vscode-%E5%A6%82%E4%BD%95%E5%9C%A8-vscode-%E4%B8%8A%E8%87%AA%E5%AE%9A%E7%BE%A9-c-%E7%9A%84-coding-style-c8eb199c57ce


3
如果我这样做,每次“粘贴”代码时,它都会向左添加一个缩进。为什么会出现这种行为? - markzzz
1
在2019年的macOS上,“设置”可以通过“Code -> Preferences -> Settings”找到,而不是“File -> Preferences -> Settings”。 - Kapocsi
哇,我之前完全不知道这个。花了很多时间想知道为什么“VSC Insiders”在与上一行相同的缩进位置后,在“=”后添加新行。尝试使用“VSC Stable”,不行,尝试清除设置,还是一样。这个超级有用,对我的“map”的列缩进也很好。++ - Det
4
顺便提一下,经过一段时间后,我更倾向于使用 { BasedOnStyle: Chromium } 而不是 { BasedOnStyle: Google, ColumnLimit: 0 } 来自动设置列,比如对像 vector<int> allKindsOfNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } 这样的内容进行排版,同时仍然将未包含在括号内的单行 if 语句换行。 - Det
还有没有一种方法可以告诉代码风格,让它尊重我手动插入的换行符(CLion默认支持)? - Patrick
我找到了!在CLion中实现“重新格式化时保留换行符”的方法是,按照这篇文章的建议,将ColumnLimit: 0设置为0。 - Patrick

35

其他答案要么不完整,要么过时,下面的步骤是有效的:

  1. Ctrl+,打开设置:

  2. 搜索C_Cpp: Clang_format_fallback Style,您将看到Visual Studio的值。

  3. 因此,从Visual Studio更改为:{BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces:Attach, AllowShortIfStatementsOnASingleLine:false, IndentCaseLabels:false, ColumnLimit:0, AccessModifierOffset:-4}

-- 第二步的详细信息 --(您可以跳过这部分)

  • 但是,Visual Studio的值与以下相同:
    { BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4 }

  • 但是,我们需要在这里更改一件事,我们不想在大括号前换行(例如:if、for等),因此我们需要进行以下更改:
    从:BreakBeforeBraces: Allman
    BreakBeforeBraces: Attach

希望这些有所帮助。


我有完全相反的问题:默认的VSC和C/C++扩展在花括号后没有换行符格式化我的代码。我将样式更改为Visual Studio,将BreakBeforeBraces更改为Allman,但仍然无效。我已经浪费了3个小时来解决这个简单的问题,它让我发疯。对于任何遇到相同问题的人:如果你找到了解决方案,请也告诉我。 - vetrov
我按照这个提示格式化了一个cpp文件,结果它将所有的包含文件按字母顺序排列,导致我的构建出现问题。 - pfa
@pfa 看起来这个答案并没有进行排序,你已经在 vscode 中添加了一些其他规则吗? - Manohar Reddy Poreddy
2
我可能会做...但不知道那可能是什么设置。我涉猎Vue和C++,Antlr。而且,我所做的只是将Visual Studio更改为上述片段。添加了SortIncludes: false,问题得到解决。 - pfa
优秀的社区输入:SortIncludes。无论您遇到了什么问题,其他人都可以从您的帖子中获得帮助。 - Manohar Reddy Poreddy

30

clang-format是一个独立的工具,用于格式化C/C++代码。虽然C/C++扩展插件自带它,但您可以使用选项C_Cpp.clang_format_path指定计算机上自己安装的clang-format版本的路径。

默认情况下,clang-format样式源(C_Cpp.clang_format_style)设置为file,它会读取一个.clang-format文件。有关可用样式选项的更多信息,请参见此页面

否则,您可能正在寻找的最简单的方法就是更改选项C_Cpp.clang_format_fallbackStyle

您要查找的样式可能是WebKit


因此,您的.vscode/settings.json文件应如下所示:

{
    "C_Cpp.clang_format_fallbackStyle": "WebKit"
}

你可能需要安装clang-format并将路径放在.vscode/settings.json中,例如:"C_Cpp.clang_format_path": "/usr/bin/clang-format-3.9" - Adriano P
2
感谢您的解决方案,我已经接近解决我的问题了,尽管只有结构体的括号和其他一些东西保持在同一行,而不是函数。 将样式指定为“LLVM”非常有效。 我还更改了“C_Cpp.clang_format_style”,而不是后备的“C_Cpp.clang_format_fallbackStyle”,一切都很好。 - Andrea Tulimiero
1
您还可以在根目录中添加自己的.clang-format文件,以修改和扩展格式规则。可使用此链接查看可用选项的参考。 - Irvin Lim

19

其他答案也不错,但是还需要更多时间来理解,因此写下此答案:


步骤:

  1. 打开Visual Studio Code
  2. 按下 Ctrl + ,
  3. 搜索 C_Cpp.clang_format_fallbackStyle

你会看到一个值为 Visual Studio (或者其他,如果之前曾更改过)


你可以复制粘贴并替换为以下其中一个选项:

  1. { BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 2, TabWidth: 2, BreakBeforeBraces: Attach, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -2 }
  2. { BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 2, TabWidth: 2, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4 }
  3. { BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Allman, AllowShortIfStatementsOnASingleLine: false, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4 }
  4. { BasedOnStyle: Google, IndentWidth: 4 }
  5. LLVM
  6. WebKit

我正在使用上面列表中的 第一个,它非常适合我的需求。


要还原到之前的设置,请按照上述步骤进行操作,并复制粘贴并替换为以下内容:

  • Visual Studio

您也可以直接将上述值复制到您的\.vscode\settings.json文件中,例如以下行:

  • "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 2, TabWidth: 2, BreakBeforeBraces: Attach, AllowShortIfStatementsOnASingleLine: true, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -2 }"

注意:

  • 由于这是JSON格式,请不要忘记在上述行之后或之前放置逗号,具体取决于您是否有其他行。

有关clang格式的更多详细信息:


18

截至2021年VS Code版本1.61.0:

您需要执行以下步骤:

  1. 按下 ctlr + ,
  2. 搜索 C_Cpp.clang_format_fallback
  3. 只需将文本字段中的值从 Visual Studio 更改为 LLVM

注意:请记住,LLVM 的制表符大小为2个单位。 如果要将制表符大小更改为4个单位,请在文本字段中添加以下配置:

{ 
    BasedOnStyle: LLVM, 
    UseTab: Never, 
    IndentWidth: 4, 
    TabWidth: 4, 
    BreakBeforeBraces: Attach, 
    AllowShortIfStatementsOnASingleLine: false, 
    IndentCaseLabels: false, 
    ColumnLimit: 0, 
    AccessModifierOffset: -4 
}

  1. 关闭设置选项卡,切换到文件选项卡按下Ctrl + S以反映您新保存的设置。

2
我建议将这些设置保存到一个 .clang-format 文件中,这样任何有权访问代码的其他人都可以使用它们。 - geon
将那个 JSON 复制粘贴到那个小输入框中对我很有帮助。 - kfir124

18
我注意到目前被接受的答案已经不再起作用。在最新版本(1.32.3)中,只需使用Ctrl + ,打开设置,然后搜索c fallback

输入图像描述

将上述值从默认值更改为LLVM,你应该就可以继续了!

2
这将缩进改为2个空格。 - Muktadir Khan
以上评论是正确的,至少目前是这样。我要补充的是,额外的格式化实际上还有助于在打印之前将一些较长的代码行适配到单行中。 - Ardent Coder
如示例所示,您可以执行{BasedOnStyle: LLVM, IndentWidth: 4}。@ArdentCoder @MuktadirKhan - Ayush Seth

10

我知道这里已经有很多答案了,但这是另一种不同的方法。将以下json插入您的设置文件中,或者进入设置并将vcFormat设置为格式化程序,并将newLine.beforeOpenBrace设置更改为sameLine

// Braces inline:
    "C_Cpp.formatting": "vcFormat",          // (Sets formatting mode to vcFormat)
    "C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "sameLine",
    "C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "sameLine",
    "C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "sameLine",
    "C_Cpp.vcFormat.newLine.beforeOpenBrace.namespace": "sameLine",
    "C_Cpp.vcFormat.newLine.beforeOpenBrace.type": "sameLine",

这个方法可以使你的代码在其他方面不需要做出显著的格式更改,仍然能够正常工作。

6
实际的clang-format选项是:
BreakBeforeBraces: Attach

1
在“文件”->“首选项”->“设置”中,有一个简单的方法,搜索格式,在C/C++页面下的扩展选项中,将C_Cpp:Formatting选项从Default更改为vcFormat

-1

针对2019年的C#:

选项 > 文本编辑器 > C# > 代码样式 > 格式化 > 换行

禁用“在类型/函数等处将开放括号放在新行上”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接