保存时自动修复需满足三条件:语言服务就绪、对应linter配置文件存在、codeactionsonsave中动作后端支持;否则无反应,需逐项排查并按语言精准配置。

保存时自动修复不是开个开关就能跑起来的事,它必须满足三个条件:语言服务已就绪、对应 Linter 配置文件存在、editor.codeActionsOnSave 里写的动作后端真支持。
为什么保存后没反应?先查这三件事
多数人配完 editor.codeActionsOnSave 发现“不生效”,其实根本没走到执行那步:
- 打开命令面板(
Ctrl+Shift+P),运行Developer: Toggle Developer Tools,看 Console 有没有Failed to run code action或No code actions available报错 - 确认当前文件的语言模式正确:右下角状态栏显示的是
JavaScript还是Plain Text?点它手动选对语言 ID - 检查项目根目录是否存在对应配置文件:
.eslintrc.js(ESLint)、pyproject.toml(Ruff)、.prettierrc(Prettier)——缺一个,source.fixAll.eslint就是空转
editor.codeActionsOnSave 怎么写才不踩坑
直接写 "source.fixAll": true 看似省事,但 TypeScript 旧版语言服务器、某些 Python 语言服务器并不认这个泛化指令,反而静默失败:
- JavaScript/TypeScript 推荐明确写:
"source.fixAll.eslint": true+"source.organizeImports": true - Python 用 Ruff:写
"source.fixAll.ruff": true(需安装charliermarsh.ruff-vscode扩展) - 别和
editor.formatOnSave共存:二者都开容易触发两次格式化,光标乱跳、引号被反复切换;统一关掉editor.formatOnSave,只靠codeActionsOnSave走到底
按语言单独控制修复行为
全局配一套规则,常导致 JSX 文件被 JS 规则误伤,或 .ts 文件因 .js 配置缺失而跳过修复:
- 在工作区
.vscode/settings.json中用语言专属块覆盖:
{
"[javascript]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.organizeImports": true
}
},
"[typescriptreact]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.addMissingImports": true
}
}
}
- 注意:
[typescriptreact]不等于[typescript],React 项目里 .tsx 文件默认用前者,漏配就白设 - Go、Rust 等语言依赖
gopls/rust-analyzer原生支持,它们只响应"source.fixAll",不认.eslint后缀
修复失败时的兜底操作
有些问题 Linter 根本不标记为 “fixable”,比如 ESLint 的 no-console 默认不可自动删,这时保存不会动它:
- 遇到灯泡图标(
Ctrl+.)能弹出修复项,但保存时不触发 → 查该规则是否带meta.fixable: "code"(ESLint 规则文档里会写) - 想强制所有警告都试修?加
"eslint.run": "onType",但代价是 CPU 占用明显升高,仅调试时临时开 - 真正难搞的是跨文件 import 补全:
source.addMissingImports有时因类型推导未完成而失效,多保存一次或手动触发Ctrl+Shift+P → Source Action: Add Missing Imports更稳
最常被忽略的一点:editor.codeActionsOnSave 是“保存时触发”,不是“实时修复”。它不替代你主动按 Ctrl+. 解决局部问题,也不保证 100% 覆盖所有警告——LSP 能力边界、规则可修复性、配置文件加载顺序,三者卡住任意一个,动作就停在半路。











