onfocuschange 是 vscode 自动保存首选模式,它在编辑器标签页失去焦点时立即保存,不依赖计时器、不卡顿、不丢内容;需排查语言专属设置、格式化插件失败及远程开发路径问题。

直接设 files.autoSave 为 onFocusChange 就行,这是最稳、最接近“改完就存”的原生方案,不用配延迟、不卡顿、不丢内容。
为什么 onFocusChange 是首选模式
它监听的是“当前编辑器标签页是否还拥有焦点”,不是窗口级或应用级事件,所以触发时机更细、更可控:
- 点击另一个已打开的文件标签页 → 当前文件立刻保存
- 点终端面板、调试控制台、搜索面板 → 当前文件立刻保存
- 点侧边栏(资源管理器、源代码管理、扩展) → 当前文件立刻保存
- 鼠标移到状态栏、点击右下角编码格式/换行符提示 → 当前文件也保存
和 afterDelay 相比,它不依赖毫秒计时器,不会因狂敲 10 秒没停而一次不存;和 onWindowChange 相比,它不等你 Alt+Tab 切出才动作,避免切到终端跑命令前那一秒的修改丢失。
onFocusChange 配置后没反应?先查这三处
VSCode 的设置优先级是:语言专属设置 > 工作区设置(.vscode/settings.json) > 用户设置。常见失效原因:
- 工作区里写了
"files.autoSave": "off"—— 打开项目后右下角若标着「工作区」,点设置顶部 Workspace 标签页确认 - 为某种语言单独关了自动保存,比如在 settings.json 里写了
"[javascript]": { "files.autoSave": "off" },那所有.js文件都不生效 - 装了 Prettier 或 ESLint 并开启了
editor.formatOnSave,但格式化失败(缺配置、语法错、插件未激活),VS Code 会静默放弃本次保存,右上角星号一直不消失
远程开发(WSL/SSH)下要不要换模式
用 onFocusChange 没问题,但要注意:在 WSL 中挂载 Windows 路径(如 /mnt/c/project)时,焦点事件可能偶发丢失,尤其频繁拖拽窗口或弹出系统通知。此时建议:
- 把项目移到 WSL 原生路径(如
~/project),焦点识别更稳定 - 不推荐 fallback 到
afterDelay—— 远程 IO 延迟会让实际保存滞后更明显,且仍可能被高频操作打断 - 如果必须用 Windows 挂载路径,可加一条保险:
files.hotExit: "onExitAndWindowClose",崩溃或意外关闭时至少能恢复未保存状态
真正容易被忽略的点是语言专属覆盖和格式化插件的静默失败——它们不会报错,只让右上角那个小圆点一直亮着,你以为开了自动保存,其实什么都没写进磁盘。











