Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式

1. 问题描述

Visual Studio的C++代码格式化可选使用clang-format, 但它只提供默认样式, 如果想使用自定义样式则需要在每个项目目录下放一个.clang-format_clang-format文件, 没有对全部项目通用的可自定义样式

2. 目标

当项目目录没有.clang-format_clang-format文件时, VS使用自定义的默认格式化样式, 而当项目目录存在.clang-format_clang-format文件时则使用它们进行格式化

3. 解决方法

这里发现VS的格式设置中有一个使用自定义clang-format.exe文件选项
所以我尝试写了一个中转exe让VS使用, 并且将clang-format.exe放在了中转exe的同级目录
通过同级目录下clang-format.txt来设置自定义的默认样式, 具体设置参照clang-format官方文档
(当启用了这个中转exe时, VS自带的默认格式设置样式选项将无效, emmm都自定义了当然就不用它自带的啦)

以下是中转exe的源代码, 小白刚学C++, 还请大佬勿喷

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

// 读文本文件, 并将带换行的文件读成一整行返回
string read_text_file(const char* file_name) {
     
    fstream fin(file_name, ios::in);
    assert(fin.is_open());
    string line_text;
    string all_text;
    while (getline(fin, line_text)) {
     
        all_text += line_text;
    }
    fin.close();
    return all_text;
}

// 判断文件是否存在
bool file_exist(const char* file_name) {
     
    fstream fin(file_name, ios::in);
    bool exist = false;
    if (fin) {
     
        exist = true;
        fin.close();
    }
    return exist;
}

int main(int argc, char* argv[]) {
     
    const string space = " ";
    string file_path = argv[0];
    string file_dir = file_path.substr(0, file_path.find_last_of("\\") + 1);  // 当前exe文件所在目录
    stringstream command;
    command << file_dir << "clang-format.exe";

    // 如果项目目录存在.clang-format或_clang-format
    // VS的调用路径在项目目录, 所以使用相对路径
    if (file_exist(".clang-format") || file_exist("_clang-format")) {
     
        for (int i = 1; i < argc; i++) {
     
            string arg = argv[i];
            command << space << arg;
        }
    } else {
       // 否则去掉VS传的-style和-fallback-style参数
        string format_text = read_text_file((file_dir + "clang-format.txt").data());
        command << space << "-style=\"{" << format_text << "}\"";  // 使用{key: value}形式写入自定义默认值
        for (int i = 1; i < argc; i++) {
     
            string arg = argv[i];
            if (arg.find("-style=") == string::npos) {
       // 去掉VS传的-style和-fallback-style参数
                command << space << arg;
            }
        }
    }
    return system(command.str().data());  // 将clang-format的结束状态返回, 提供给VS结果信息
}

这里贴上我个人习惯使用的代码格式化样式(上面贴的代码就是用这个格式化出来的)
以下是clang-format.txt内容(key: value)

AccessModifierOffset: -4,
AlignEscapedNewlines: Left,
AllowShortFunctionsOnASingleLine: Inline,
ColumnLimit: 110,
IndentCaseLabels: true,
IndentWidth: 4,
KeepEmptyLinesAtTheStartOfBlocks: false,
PointerAlignment: Left,
SpaceAfterCStyleCast: true,
SpacesBeforeTrailingComments: 2,
TabWidth: 4

4. Visual Studio使用方法

emmm其实这步有点多余, 因为前面已经写过使用方法啦, 但这里还是再整理一下

  1. 随便找个地方把这三个文件塞进去, 比如我放在了VisualStudio目录
    Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式_第1张图片
  2. 启用ClangFormat支持使用自定义clang-format.exe文件, 选择上一步的custom-format.exe并确定
    Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式_第2张图片
  3. 现在可以回到编辑器, 使用快捷键进行代码格式化啦

5. VS Code使用方法

  1. 首先VS Code需要安装C/C++扩展模组
    Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式_第3张图片

  2. 然后在设置中查找C_Cpp.clang_format_path, 鼠标移上点击左上角齿轮, 点击以JSON格式复制设置
    Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式_第4张图片

  3. 最后点击在settings.json内编辑, 粘贴上并将值null设置为custom-format.exe的路径
    Visual Studio和VS Code使用clang-format自定义C++代码默认格式化样式_第5张图片

  4. 现在可以回到编辑器, 使用快捷键进行代码格式化啦

你可能感兴趣的:(C++学习笔记,C++,Visual,Studio,clang-format,Visual,Studio,Code,VS)