onfocuschange 模式下切换标签页会保存,因其语义是编辑器失去焦点即保存,而vscode中单击资源管理器或ctrl+tab切换均导致焦点离开;停用该模式改用afterdelay或off更合适。

onFocusChange 模式下切换标签页为什么会保存
因为 onFocusChange 的语义就是「当前编辑器失去焦点时保存」,而 VSCode 默认单击资源管理器或 Ctrl+Tab 切换标签页,都会让原编辑器失去焦点——哪怕只是瞬间。这不是 bug,是设计如此。它不区分“切到另一个文件”和“切到终端”,只要焦点离开当前编辑器,就触发保存。
停用 onFocusChange 是最直接的解法
如果你频繁在多个文件间跳转、又不希望每次切都写磁盘,onFocusChange 本身就不适合你。改用以下任一模式:
-
off:彻底关闭自动保存,靠Ctrl+S手动控制,最可控 -
afterDelay:只在停笔后延迟保存,切换标签页完全无影响;但必须同步设files.autoSaveDelay(推荐1000~1500) - 别再用
onWindowChange:它已在 VS Code 1.80+ 中被移除,配置了也无效
误配工作区设置会覆盖全局行为
即使你在用户设置里选了 afterDelay,只要项目根目录下的 .vscode/settings.json 里写了 "files.autoSave": "onFocusChange",当前工作区就会强制走焦点保存。检查方法:
- 打开命令面板(
Ctrl+Shift+P),运行Preferences: Open Workspace Settings (JSON) - 搜索
files.autoSave,删掉或改成和你预期一致的值 - 注意:没有显式声明时,工作区不会继承用户设置,而是 fallback 到默认
off
格式化插件失败会让保存“卡住”
很多人以为没保存,其实是 onFocusChange 触发了保存,但因 Prettier 等插件格式化失败(比如语法错误),VSCode 中止整个流程,文件仍保持 dirty 状态。此时状态栏显示“● 文件名”,看似没存,实则保存逻辑已执行但被拦截。验证方式:
- 临时禁用所有格式化插件,再切标签页看是否保存
- 打开输出面板(
Ctrl+Shift+U),选择Log (Window),观察保存时是否有报错 - 若确认是格式化问题,可关掉
editor.formatOnSave或调高容错阈值











