• windows 下 vs code 格式化代码(clang-format)


    vscode 的格式化代码能力来源于插件(有不止一种插件提供格式化功能),而非 vscode 本身

    这个可以通过卸载插件试出来,卸载到了某一个插件之后就无法格式化了,就是那个插件提供的格式化

    一、安装插件

    商店搜索 clang-format,第一个下载多的

    二、windows 下载 LLVM-17.0.1-win64.exe (win64.exe 结尾的安装包)

    Releases · llvm/llvm-project · GitHub

    可以直接把这个 exe 解压,里面有个 bin 目录,bin 目录有个 clang-format.exe (就要这个文件)

    三、配置 clang-format.exe 路径

    vscode——设置——拓展——clang-format

    如果不配置 clang-format.exe 路径,格式化代码就会报错

    The 'clang-format' command is not available. Please check your clang-format.executable user setting and ensure it is installed.

    四、格式化命令

    格式化部分代码:选中部分代码,ctrl + k , ctrl + f

    格式化所有代码:shift + alt + f  或者右键代码空白处,有个格式化代码选项

    五、设置默认格式化代码插件

    右键代码空白位置,还是上图,有个 使用...格式化文档 ,点进去可以设置默认格式化的插件,如果你有多个格式化插件,点击配置默认格式化程序,然后请选择 Clang-Format,如果只有一个格式化插件,可忽略此步骤

    六、设置默认样式

    设置——拓展——clang-format,这里可以选择一些别人定好的样式,比如:LLVM

    如果不需要个性化设置,那么到这就结束了

    七、个性化设置

    格式化的个性化设置可以通过指定 .clang-format 文件位置来配置,设置右上角,点击红框处,打开设置的 json 文件 ( .clang-format  文件的优先级高于第六章的别人定好的样式)

    然后追加一行 ( file: 不可以省略,省略可能报错 Invalid value for -style),后面接 .clang_format 文件的具体路径,文件名貌似随便起,路径对了就行

    1. "clang-format.style": "file:C:\\Users\\AA\\Documents\\clang-format\\.clang-format"
    2. # 反斜杠也是可以的
    3. # "clang-format.style": "file:C:/Users/AA/Documents/clang-format/.clang-format"

    示例:

    官方有提供 .clang_format 文档说明

    Clang-Format Style Options — Clang 18.0.0git documentation

    或者参考其他博主

    clang-format 最全格式说明_.clang-format-CSDN博客

    值得一提的是 .clang_format 这个文件应该是一种通用的格式,很多插件都支持配置这个文件的路径

    八、关于 .clang_format

    简单聊聊怎么看官方文档和 .clang_format 文件编写,首先 .clang_format 是一个 yaml 格式,比如

    1. ---
    2. # We'll use defaults from the LLVM style, but with 4 columns indentation.
    3. BasedOnStyle: LLVM
    4. IndentWidth: 4
    5. ---
    6. Language: Cpp
    7. # Force pointers to the type for C++.
    8. DerivePointerAlignment: false
    9. PointerAlignment: Left
    10. ---
    11. Language: JavaScript
    12. # Use 100 columns for JS.
    13. ColumnLimit: 100
    14. ---
    15. Language: Proto
    16. # Don't format .proto files.
    17. DisableFormat: true
    18. ---
    19. Language: CSharp
    20. # Use 100 columns for C#.
    21. ColumnLimit: 100

    1、yaml

    可以先看看 yaml 文件的基础知识,有点像 key: value 的结构

    Yaml文件的基础知识 - 知乎

    然后说说要注意的点 

    ①、yaml 大小写敏感,这个建议是复制官方文档的字段,不容易出错

    ②、冒号后面必须有个空格,然后别用中文冒号

    1. BasedOnStyle: LLVM
    2. # 下面这种是错的
    3. BasedOnStyle:LLVM

    ③、--- 三个横杠用于分割块,块中的 key 值不能重复(插一句别的,上面示例中三个横杠分割了不同语言的格式化设置,第一个块应该是全局配置)

    ④、缩进敏感,类似 python,因为没有括号分隔,全靠缩进,所以别乱缩进

    ⑤、关于 value,几种常见值

    1. #第一种 key: value
    2. SpacesBeforeTrailingComments: 3
    3. #第二种 key: key: value
    4. AlignConsecutiveMacros:
    5. Enabled: true
    6. AcrossEmptyLines: true
    7. AcrossComments: false
    8. #第三种 key: 数组
    9. WhitespaceSensitiveMacros:
    10. - STRINGIZE
    11. - PP_STRINGIZE
    12. - BOOST_PP_STRINGIZE
    13. - NS_SWIFT_NAME
    14. - CF_SWIFT_NAME

    2、查看官方文档

    官方文档的格式名是按照字母排序的

    Clang-Format Style Options — Clang 18.0.0git documentation

     ①、样例1,常规类型

    红框代表 key 字段,绿框代码 value 的类型,像整型、布尔大家应该认识,最后那个 clang-format 3.3 是 clang-format.exe 的版本,如果下的最新版可无须关心

    AccessModifierOffset: 2

     ②、样例2,枚举类型,也可以认为是一个字符串

    绿框里是一个自定义类型,可选的值为 in configuration 后面的红框里的值,别看成 BAS_Align 

    AlignAfterOpenBracket: Align

    ③、样例3,复合类型

    这种就还是以文档内容为主,文章说提供了两种写法,一种是 key: value,一种是 key: key: value,以实际文档为主

    1. # 方式一
    2. AlignConsecutiveMacros: Consecutive
    3. # 方式二
    4. AlignConsecutiveMacros:
    5. Enabled: true

    然后大家结合全文翻译就能自己写 .clang_format 文件了

    九、我自己用的 .clang_format

    其实下面 BasedOnStyle 里面就是一个大的格式集合,我们只需要找到我们不习惯的格式,单独拎出来改就行,不用每个格式都配置

    1. ---
    2. BasedOnStyle: LLVM
    3. IndentWidth: 4
    4. ---
    5. Language: Cpp
    6. # 列限制,超过这个列数才折行,这个值低的话很容易自动折行
    7. ColumnLimit: 150
    8. # 空行分割块,比如两个相邻的结构体,中间自动加个空行
    9. SeparateDefinitionBlocks: Always
    10. # 结构体数组阵列,右对齐,描述有点抽象,建议看官方文档
    11. AlignArrayOfStructures: Right

    我只配置了限制自动折行的列数,他们有个智能折行的操作,有时候没几列就折行了,我就调高一点这个列限制列数

    然后就是分割块,有时候我们两个结构体离得很近,就中间自动插入一个空格,函数和函数之间也属于块的范畴,处理也是同理,我理解大括号里面的可能都叫做块

    最后一个配置像这样

    1. // 左对齐
    2. struct test demo[] =
    3. {
    4. {56, 23, "hello"},
    5. {-1, 93463, "world"},
    6. {7, 5, "!!" }
    7. };
    8. // 右对齐
    9. struct test demo[] =
    10. {
    11. {56, 23, "hello"},
    12. {-1, 93463, "world"},
    13. { 7, 5, "!!"}
    14. };
  • 相关阅读:
    npm run build小技巧
    springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
    Python机器学习实战-特征重要性分析方法(1):排列重要性(附源码和实现效果)
    《C++游戏编程入门》第9章 高级类与动态内存:Game Lobby
    设备驱动理论详解,Linux操作系统原理与应用
    C#中的Dispatcher:Invoke与BeginInvoke的使用
    [ByteCover2]-音频翻唱检索论文笔记
    基于Java语言实现模拟银行存取款业务系统
    教育行业如何通过互联网推广品牌?媒介盒子告诉你
    在no branch上commmit后,再切换到其他分支,找不到no branch分支的修改怎么办?
  • 原文地址:https://blog.csdn.net/qq_38781075/article/details/133397553