vscode的editor.codeactionsonsave仅触发语言服务器明确标记为source.fixall、source.organizeimports等特定kind的code action,不覆盖普通quickfix;需显式配置对应键值(如"source.fixall.eslint": true),且依赖语言服务正常启动和项目配置完备。

VSCode 的 editor.codeActionsOnSave 设置能自动应用部分 Quick Fix,但它不等于“所有报错都修”,实际生效范围取决于语言服务器是否返回可安全自动执行的 codeAction,且必须显式启用对应键值。
哪些修复能被保存时自动触发
只有语言服务器标记为 source.fixAll、source.organizeImports 或 source.fixAll.eslint 等特定类型的 code action 才会被 editor.codeActionsOnSave 拦截并执行。普通 quickfix 类动作(如“创建变量”“添加类型断言”)默认不参与自动保存流程。
- TypeScript/JavaScript:启用
"source.organizeImports": true可自动整理 import;"source.fixAll": true会尝试修复所有可安全推断的错误(如拼写修正、缺失 return) - ESLint:需安装
esbenp.vscode-eslint扩展,并设置"source.fixAll.eslint": true,否则 ESLint 报的警告不会进自动修复队列 - Python(Pylance):支持
"source.organizeImports": true,但"source.fixAll"效果有限——比如未声明变量不会自动生成let x = undefined,因语义风险高 - Rust(rust-analyzer):
"source.fixAll"可自动补 impl、添加 use 声明,前提是Cargo.toml解析成功且依赖已下载
为什么开了 editor.codeActionsOnSave 却没反应
常见原因不是设置没生效,而是语言服务根本没返回带 kind: "source.fixAll" 的 code action。这通常由以下情况导致:
- 文件未被识别为正确语言模式:右下角显示
Plain Text或Unknown?点击切换成TypeScript、Python等 - 项目缺少必要配置:TS/JS 项目没有
tsconfig.json或jsconfig.json,Pylance 就不会提供 import 组织建议;Python 项目没pyproject.toml或setup.py,自动补全 import 可能失效 - 语言服务器启动失败:打开
Developer: Toggle Developer Tools,看 Console 是否有Failed to start language client或超时日志 - 诊断来自非 LSP 来源:比如纯正则匹配的 TODO 注释、自定义 shell 脚本输出的 warning,这类诊断不带 code action,自然无法自动修复
editor.codeActionsOnSave 的键值必须精确匹配
这个设置是对象类型,不是布尔开关。填 true 本身无效,必须指定具体能力键名,例如:
"editor.codeActionsOnSave": {
"source.organizeImports": true,
"source.fixAll.eslint": true,
"source.fixAll": false
}
注意:"source.fixAll": true 是全局兜底,但很多语言服务器(如 Pylance)默认禁用它,因为可能误改逻辑;而 "source.fixAll.eslint" 更安全,只作用于 ESLint 明确标为 fixable: true 的规则。
如何确认某个错误是否支持自动修复
最直接的方式是手动触发一次 Quick Fix(Cmd + . 或 Ctrl + .),观察弹出菜单里某项是否带 ⚡ 图标(VSCode 1.89+ 默认标识“可自动执行”的动作)。如果没图标,说明该 code action 未声明 isPreferred 或未归类到 source.* kind 下,就不会进 codeActionsOnSave 流程。
真正决定能否自动修复的,从来不是 VSCode 本身,而是你正在用的语言服务器返回了什么 —— 这点容易被忽略,但恰恰是调试自动修复失效时第一个该查的地方。











