VisualStudio和VSCode使⽤clang-format⾃定义C++代码默认格式化样式
问题
Visual Studio的C++代码格式化可选使⽤clang-format,但它只提供默认样式,如果想使⽤⾃定义样式则需要在每个项⽬⽬录下放⼀个.clang-format或_clang-format⽂件,没有对全部项⽬通⽤的可⾃定义样式
⽬标
当项⽬⽬录没有.clang-format或_clang-format⽂件时,VS使⽤⾃定义的默认格式化样式,⽽当项⽬⽬录存在.clang-format或_clang-format⽂件时则使⽤它们进⾏格式化
解决⽅法
这⾥发现VS的格式设置中有⼀个使⽤⾃定义⽂件选项
所以我尝试写了⼀个中间exe让VS使⽤,并且将放在了中间exe的同级⽬录
通过同级⽬录下来设置⾃定义的默认样式, 具体设置参照
(当启⽤了这个中间exe时, VS⾃带的默认格式设置样式选项将⽆效,emmm都⾃定义了当然就不⽤它⾃
带的啦)
以下是⽤Rust写的中间exe的源代码
use std::{
env,
env::Args,
ffi::OsStr,
fs::File,
io::{BufRead, BufReader, Result},
path::{Path, PathBuf},
process,
process::Command,
};
const CLANG_FORMAT_EXE_NAME:&str ="clang-format";
const CLANG_FORMAT_TXT_NAME:&str ="";
/// 从规则⽂本⽂件⽣成-style参数
fn generate_style_arg<P: AsRef<Path>>(current_dir: P)-> Result<String>{
let rule_file: File = File::open(current_dir.as_ref().join(CLANG_FORMAT_TXT_NAME))?;
let mut style_rules: String = String::from("-style={");
for line in BufReader::new(rule_file).lines(){
style_rules.push_str(&line?);
style_rules.push_str(",");
}
style_rules.pop();// 删掉最后多余的逗号
style_rules.push_str("}");
Ok(style_rules)
}
/// 以⼦进程运⾏clang-format, 输⼊输出继承⾃⽗进程, 阻塞直⾄⼦进程退出, 返回退出码
fn spawn_clang_format<P, I, S>(current_dir: P, args: I)-> Result<Option<i32>>
where
P: AsRef<Path>,
I: IntoIterator<Item = S>,
S: AsRef<OsStr>,
{
Ok(
Command::new(current_dir.as_ref().join(CLANG_FORMAT_EXE_NAME))
.args(args)
.spawn()?
.wait()?
.code(),
)
}
fn main(){
let current_exe: PathBuf = env::current_exe().unwrap();
let current_dir:&Path = current_exe.parent().unwrap();
let mut args: Args = env::args();
<();// 去掉第⼀个参数程序名
process::exit(
// 将clang-format返回的状态码返回给VS
if Path::new(".clang-format").exists()|| Path::new("_clang-format").exists(){
// 如果项⽬⽬录有.clang-format或_clang-format则使⽤VS的原参数
spawn_clang_format(current_dir, args).unwrap().unwrap()
}else{
// ⼲掉VS传⼊的-style和-fallback-style参数
let mut args_vec: Vec<String>= args
.filter(|arg:&String|!ains("-letter-spacing: -3px;">.
collect();
// 让clang-format如果出错就不进⾏格式化
args_vec.push(String::from("-fallback-style=none"));
// 传⼊⾃定义的-style参数
args_vec.push(generate_style_arg(current_dir).unwrap());
spawn_clang_format(current_dir, args_vec).unwrap().unwrap()
},
)
}
贴上我习惯使⽤的代码格式化样式
以下是内容(key: value)
BasedOnStyle: Chromium
AccessModifierOffset:-4
AlignConsecutiveMacros:true
AlignEscapedNewlines: Left
AllowShortBlocksOnASingleLine: Empty AllowShortCaseLabelsOnASingleLine:true AllowShortFunctionsOnASingleLine: Empty AllowShortLambdasOnASingleLine: Empty
AllowAllArgumentsOnNextLine:false AllowAllParametersOfDeclarationOnNextLine:false
BinPackArguments:false
BinPackParameters:false
ColumnLimit:110
FixNamespaceComments:true
BinPackParameters:false
IndentCaseLabels:true
IndentWidth:4
SortIncludes:false
SpaceBeforeCtorInitializerColon:false
SpaceBeforeInheritanceColon:false
MaxEmptyLinesToKeep:1
NamespaceIndentation: All
KeepEmptyLinesAtTheStartOfBlocks:false
PointerAlignment: Left
SpaceAfterCStyleCast:true
SpacesBeforeTrailingComments:2
TabWidth:4
Visual Studio使⽤⽅法
visual studio和vs code的区别emmm其实这步有点多余,因为前⾯已经写过使⽤⽅法啦,但这⾥还是再整理⼀下
1. 随便个地⽅把这三个⽂件塞进去,⽐如我放在了E:\EnvironmentUserPath\CustomFormat⽬录
2. 启⽤ClangFormat⽀持并使⽤⾃定义⽂件,选择上⼀步的并确定
3. 现在可以回到编辑器,使⽤快捷键进⾏代码格式化啦
VS Code使⽤⽅法
1. ⾸先VS Code需要安装C/C++扩展模组
2. 然后在设置中查C_Cpp.clang_format_path,填⼊的路径就好啦
3. 现在可以回到编辑器,使⽤快捷键进⾏代码格式化啦
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论