必须同时启用files.autosave和editor.formatonsave,并为每种语言单独配置editor.defaultformatter及安装对应格式化插件,否则保存时代码不会自动格式化。

editor.formatOnSave 开了但代码没变?先确认 files.autoSave 是否启用
VSCode 默认 files.autoSave 是 "off",也就是说:哪怕你开了 editor.formatOnSave,只要没按 Ctrl+S(或没配自动保存),格式化根本不会触发。这不是 bug,是设计逻辑——“保存前格式化”隐含了“得先有保存动作”。
必须显式设置:
-
files.autoSave为"afterDelay"(推荐)、"onFocusChange"或"onWindowChange" - 若选
"afterDelay",务必同步配files.autoSaveDelay(单位毫秒),例如1000 - 检查当前生效的是用户设置还是工作区设置:项目根目录若有
.vscode/settings.json,它会覆盖全局配置
[javascript] 和 [typescript] 的 defaultFormatter 必须分开配
只在顶层写 "editor.defaultFormatter": "esbenp.prettier-vscode" 是无效的,甚至会让 Python/Go 文件报错或静默失败。VSCode 要求按语言块精确指定。
正确做法是为每种目标语言单独声明:
- 打开命令面板(
Ctrl+Shift+P),输入Preferences: Configure Language Specific Settings,选JavaScript→ 再点右下角“Configure Default Formatter”,选Prettier - Code formatter - 或直接编辑
.vscode/settings.json,加入类似:
{
"[javascript]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
注意扩展 ID 必须写全:esbenp.prettier-vscode,写成 prettier 或 Prettier 都找不到插件。
右下角状态栏显示 “None”?说明格式化器没绑定成功
打开一个 .js 文件,看右下角状态栏。如果显示 None,或显示 ESLint(但你想要 Prettier),就代表当前文件没匹配到你期望的格式化器。
常见原因:
- 对应语言的格式化插件没装,比如
esbenp.prettier-vscode(JS/TS)、ms-python.black-formatter(Python) - 插件已安装但被禁用(检查扩展面板里的启用状态)
- 文件类型识别错误:比如
.ts文件被识别成Plain Text,需点击右下角语言名 → 选择TypeScript - 开发者工具报错:
No formatter registered for 'typescript',说明语言配置和插件没对上
多个格式化器共存时,ESLint 和 Prettier 容易互相覆盖
JS/TS 项目里同时启用 dbaeumer.vscode-eslint 和 esbenp.prettier-vscode 的格式化能力,会导致缩进跳、引号切、光标乱跑——这不是 VSCode 崩溃,是规则冲突。
安全解法是明确分工:
- 停用 ESLint 的格式化:
"eslint.format.enable": false - 保留其 lint 提示,并用
editor.codeActionsOnSave让它只做修复:"source.fixAll.eslint": true - 把格式化权完全交给 Prettier,确保
editor.defaultFormatter指向它,且eslint.format.enable不为true
别忽略 editor.formatOnSaveMode:VSCode 1.84+ 默认是 "file",设成 "modifications" 容易因 diff 失败而静默跳过格式化,尤其在大文件或含 Git 冲突标记时。











