必须设为"onFocusChange",因VSCode已移除onWindowChange且无系统级窗口焦点监听能力;它监听编辑器控件失焦(如切至终端、Chrome等),仅保存当前激活的已命名文件,不支持Untitled-1或只读文件。

选 onFocusChange,不是 onWindowChange,也不是延时模式 —— 这是目前唯一稳定、原生、覆盖“切出 VSCode 就保存当前文件”场景的配置。
为什么必须是 onFocusChange?
VSCode 没有监听操作系统窗口焦点的能力,onWindowChange 在 1.80+ 版本已被移除;你如果在 settings.json 里还写着它,VSCode 会静默忽略,不报错也不生效。而 onFocusChange 实际监听的是编辑器控件(即当前打开的文件标签)是否失去焦点 —— 只要你从这个文件切走,无论切到终端、另一个标签页、侧边栏,还是直接 Alt+Tab 切到 Chrome,它都会触发保存。
- ✅ 有效触发:点终端、Ctrl+Tab 切标签、鼠标点资源管理器、Alt+Tab 切出 VSCode
- ❌ 不触发:最小化窗口(焦点仍在)、弹出系统通知、按 Ctrl+P 打开命令面板(编辑器焦点未丢失)
- ⚠️ 它只保存当前激活的已命名文件,
Untitled-1或只读文件会被跳过,不提示
onFocusChange 常见“没反应”的真实原因
不是配置写错了,而是保存流程被中途拦停。最常卡在这几个环节:
- 工作区设置覆盖了用户设置:检查项目根目录下
.vscode/settings.json是否含"files.autoSave": "off" - 格式化插件失败:启用了
editor.formatOnSave,但 Prettier 缺配置、ESLint 报语法错误,VSCode 会回滚本次保存,表现为“切走再回来,内容还是旧的” - 文件路径被排除:若该文件匹配了
files.exclude(如"**/dist/**")或files.watcherExclude,自动保存逻辑直接跳过 - 权限问题:文件被其他进程锁定,或磁盘只读,VSCode 静默失败,不弹窗也不提示
怎么配才真正生效
别依赖设置 UI 的下拉菜单 —— 它有时缓存延迟或受扩展干扰。直接编辑 settings.json 更可靠:
{
"files.autoSave": "onFocusChange",
"editor.formatOnSave": false
}
- 大小写敏感:
"onFocusChange"必须首字母大写,"onfocuschange"或"on-focus-change"都无效 -
files.autoSaveDelay对它完全无作用,删掉或留着都一样 - 如果要用格式化,先确认 Prettier/ESLint 已正确安装、配置、启用,再把
editor.formatOnSave设为true - 远程开发(SSH/WSL)下,优先用
onFocusChange;onWindowChange在这类环境几乎不可用
别碰延时模式(afterDelay)除非你真需要它
afterDelay 是另一种思路:编辑暂停 N 毫秒后才保存。它适合狂敲代码中途不希望频繁落盘的人,但和“切出就存”是两回事。如果你设了 afterDelay 却期望切到浏览器立刻保存,那注定失望 —— 它根本不管窗口是否失焦,只看编辑器有没有停顿。
- 延迟值必须配合
files.autoSaveDelay(单位毫秒),比如"files.autoSaveDelay": 3000 - 它会批量保存所有 dirty 文件,不只是当前激活的那个
- 在 WSL 或多显示器环境下比
onFocusChange更稳定,但响应慢,不适合防忘存
真正容易被忽略的点是:VSCode 的“焦点”永远在编辑器控件层,不在应用层。你无法靠一个配置让整个 IDE 响应操作系统级的窗口事件 —— 所有看似“窗口失焦就保存”的效果,本质都是编辑器标签被切走的副产品。理解这点,才能避开绝大多数配置陷阱。











