VSCode javascript.format括号前空格设置对C代码粘贴格式化失效
javascript.format.insertSpaceBeforeFunctionParenthesis、typescript.format.insertSpaceBeforeFunctionParenthesis是VSCode内置JS/TS语言服务专属的格式化配置,仅对.js、.ts等JavaScript/TypeScript类文件生效,完全不会作用于C语言代码。
你粘贴C代码时触发的格式化,走的是当前C语言关联的格式化扩展的规则,默认规则会移除函数名和左括号之间的空格,才会出现你遇到的问题。
另外你提到按CTRL+Z恢复空格后缩进丢失,是因为formatOnPaste的执行逻辑是先插入粘贴的原始内容,再立刻执行格式化替换内容:第一次撤销只会撤销格式化操作,退回到刚粘贴原始内容的状态,此时如果复制来源的缩进规则和当前文件不匹配,就会出现缩进错乱,这不是功能bug。
按以下步骤配置C语言专属的格式化规则即可:
- 先确认当前C文件使用的格式化器:打开任意.c文件,看VSCode右下角状态栏,会标注当前生效的格式化程序,绝大多数场景下默认是微软官方的C/C++(cpptools)扩展,少部分用户会用clangd作为C语言格式化器。
- 如果使用微软C/C++(cpptools)扩展:直接打开VSCode的
settings.json配置文件,在原有配置基础上新增C语言格式化相关配置,参考如下:
{ "editor.formatOnPaste": true, "javascript.format.insertSpaceBeforeFunctionParenthesis": true, "typescript.format.insertSpaceBeforeFunctionParenthesis": true, // 新增C/C++格式化配置 "C_Cpp.formatting": "clangFormat", "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: LLVM, SpaceBeforeParens: ControlStatementsAndFunctions, IndentWidth: 4 }" }
其中SpaceBeforeParens: ControlStatementsAndFunctions就是控制函数名与左括号之间保留空格的规则,和你给JS/TS设置的效果完全一致,IndentWidth可以根据你自己的缩进习惯改成2或者其他数值。
- 如果使用clangd作为C语言格式化器:不需要改VSCode的settings.json,直接在全局配置目录或者项目根目录新建
.clang-format文件,写入如下配置即可生效:
SpaceBeforeParens: ControlStatementsAndFunctions
配置完成后重启VSCode,再粘贴C代码就会自动保留函数名和左括号之间的空格,不需要再手动撤销调整。
注意:VSCode所有带语言前缀的配置项(格式为
[语言id].配置名)都仅对对应语言生效,跨语言场景下必须配置对应语言的专属格式化规则,无法复用其他语言的配置。
内容的提问来源于stack exchange,提问作者ashok

