vscode运行前不自动保存是设计使然,需用onfocuschange模式(切出编辑器即保存)或code-runner.savefilebeforerun插件配置实现真正运行前保存。

VSCode 点 Run 或 Debug 不会自动保存文件,运行的永远是磁盘上已写入的内容——你改了但没 Ctrl+S,它就执行旧代码。这不是 Bug,是设计:编辑、保存、执行三者解耦。要解决,得明确区分「防丢」和「防旧版本运行」两种需求,它们对应不同配置。
files.autoSave 选 onFocusChange 能覆盖多数“运行前”场景
VSCode 没有 onRun 模式,但 onFocusChange 最贴近你准备运行的动作节点:鼠标从编辑器切到终端、调试面板、侧边栏,甚至分屏终端的另一栏,都会立刻触发保存。这比 afterDelay 可靠得多——后者留出 1 秒空白期,你可能在延迟结束前就点了运行键,结果还是旧逻辑。
-
onWindowChange太宽泛:微信弹窗盖住 VSCode 就触发,容易误存未完成草稿 -
afterDelay默认 1000ms,小写入在 WSL2 或低端 SSD 上还可能被内核缓存拖慢落盘,导致 nodemon 读到脏数据 - 必须先给文件指定路径:标题栏带
Untitled-1的临时文件永远不会写入磁盘,Ctrl+S一次再编辑是硬前提
code-runner.saveFileBeforeRun 是唯一真正绑定“运行”动作的开关
如果你用的是 formulahendry.code-runner 插件(常见于 Python/JS/Go 快速执行),它的 code-runner.saveFileBeforeRun 才是真·运行前强制保存。它绕过 files.autoSave 设置,在每次点击“运行代码”按钮或触发快捷键前,调用一次保存。
- 仅对 code-runner 支持的语言生效,对
launch.json调试器、自定义终端脚本无效 - 启用方式:设置里搜
code-runner.saveFileBeforeRun勾选,或手动加到settings.json:"code-runner.saveFileBeforeRun": true - 注意优先级:它高于
files.autoSave,但只作用于 code-runner 触发的运行流程
工作区 settings.json 会无声覆盖全局配置
你在用户设置里开了 onFocusChange,但某个项目里运行还是不保存——大概率是项目根目录下的 .vscode/settings.json 里写了冲突项。VSCode 的配置优先级是:工作区 > 用户 > 默认。
- 打开
.vscode/settings.json,搜索"files.autoSave",如果值是"off"或"afterDelay",直接删掉这行 - Remote-SSH / WSL 场景下,用户设置在远程机器上,不是本地;需检查远程端的
~/.vscode/settings.json - 某些插件(如 Prettier)启用了
editor.formatOnSave,若格式化失败(语法错误、依赖缺失),保存会被静默中断——看右下角状态栏是否闪现红色提示
真正卡住人的地方往往不在设置本身,而在「未保存的临时文件」+「工作区覆盖」+「格式化插件静默失败」这三者的组合。哪怕 code-runner.saveFileBeforeRun 开了,如果文件还没路径、或者 Prettier 报错拦住了保存,运行时照样读旧内容。











