files.autoSave设为afterDelay是最稳选择,需配合files.autoSaveDelay设为500–2000毫秒,兼顾防丢与性能;它不依赖窗口或焦点切换,而是停笔即防抖保存,避免onFocusChange漏存或多窗口下onWindowChange误存。

files.autoSave 设为 afterDelay 是最稳的选择
直接改 files.autoSave 为 afterDelay,再配 files.autoSaveDelay 到 500–2000 毫秒之间,能覆盖绝大多数日常场景。它既不会像 onFocusChange 那样在多标签间狂切时漏存(比如你点一下终端又切回来,编辑器可能根本没来得及写盘),也不会像 onWindowChange 那样一 Alt+Tab 就全量保存、拖慢响应。
常见错误现象:有人设成 onFocusChange 后发现改了三行代码却没保存——其实是焦点在编辑器内部切换(比如从代码区点到问题面板),这个动作不触发保存;只有焦点彻底离开 VSCode 窗口才生效,但那个选项叫 onWindowChange,名字容易看混。
-
afterDelay是唯一真正“防手滑”的模式:停笔 1 秒就落盘,不依赖你是否切换窗口 - 延迟别设太低(如 100ms):频繁小修改会引发磁盘抖动,尤其机械硬盘或老旧 SSD
- 别设太高(如 5000ms):思考超过 5 秒就可能白干,特别是调试时临时加 console.log
Local History 插件才是真备份,不是 files.autoSave
files.autoSave 只是把当前内容写进原文件,不生成历史副本;而 Local History(作者 xyz)会在项目根目录下建 .history/ 文件夹,每次保存前自动存一个带时间戳的快照。这才是你 Ctrl+Z 按烂了也回不去时的救命稻草。
使用场景很明确:想找回 3 分钟前删掉的那段正则,或者对比刚改坏的函数和上一版的区别。它不依赖 Git,也不连网,纯本地。
- 只监控已打开的文件:没在编辑器里打开的
utils.js,改了也不会被记录 - 默认保留 30 天快照,想缩短可改
local-history.maxFileHistory(单位是天) - 右键文件 →
Local History: Show History就能拉出所有版本,支持 diff 和一键恢复
Git 预提交钩子比任何插件都可靠
Local History 再好,也只是本地快照;一旦误删整个项目文件夹,.history 也跟着没了。真正抗删除、可追溯、能协作的备份,只能靠 Git 提交。但很多人卡在「还没写完不敢提交」——这时候用 pre-commit 钩子自动暂存未完成的变更就行。
例如在 .git/hooks/pre-commit 里加一行:git add -u && git stash push -m "auto-stash $(date +%s)"。它会在每次 git commit 前,把工作区所有已跟踪文件的修改先塞进 stash 栈。哪怕你中途 git reset --hard 错了,也能用 git stash pop 拿回来。
- 注意 stash 不会包含新文件(untracked),要备份新建的配置文件得手动
git add - VSCode 的
editor.formatOnSave和这个钩子天然配合:保存即格式化,提交前自动暂存,节奏不被打断 - 别把钩子逻辑写进
package.jsonscripts 里——那只是 npm run 时才触发,不是真正的 Git 行为
不要碰 onWindowChange,除非你每天只开一个 VSCode 窗口
onWindowChange 表面看很安全:切到浏览器就保存,像 Word 那样。但它有个致命问题——只要 VSCode 窗口失焦,所有已修改文件立刻写盘。如果你习惯开两个 VSCode 窗口(比如一个写前端,一个查后端日志),切过去那一瞬间,另一个窗口里所有脏文件全被强制刷盘,包括你正在重命名、还没想好变量名的临时文件。
更麻烦的是,它和某些语言服务冲突。比如 TypeScript Server 在文件保存瞬间会重新做类型检查,如果窗口频繁失焦(比如你边写边查文档),TS 会反复重建语义模型,CPU 占用飙升,编辑器变卡。
- 它不区分「有意修改」和「光标乱点导致的空保存」,容易污染 Git diff
- macOS 下配合 Mission Control 切换桌面时,也会触发 window change,行为不可控
- 真要防崩溃丢数据,不如开
files.hotExit+window.restoreWindows,它们管的是进程级恢复,比文件级保存更底层
复杂点在于:自动保存、本地快照、Git 暂存这三层不是替代关系,而是叠加关系。少一层,某类误操作就救不回来。最容易被忽略的是 Local History 只录「打开过的文件」——你深夜改了个没打开的 config.json,它就完全不管。这时候,git status 才是你最后的防线。


















