vscode窗口合并后项目丢失,是因为code -r复用窗口时只加载最后一个路径,不保留此前打开的独立文件夹;唯一可靠方案是提前创建.code-workspace多根工作区并用--add添加路径。

VSCode窗口合并后项目丢失,不是项目被删了,而是它把多个窗口“叠”在一起却没保留各自的工作区上下文——默认行为是复用窗口时只加载最后一个打开的文件夹,前面的全丢。
为什么合并窗口后只剩一个项目
VSCode 的 code -r(或 --reuse-window)命令本质是「复用当前窗口并加载新路径」,不是「把新路径加到现有窗口里」。它不会自动创建多根工作区,也不会保留之前打开的独立文件夹窗口。如果你原本开着 A 项目和 B 项目两个窗口,执行 code -r ./C,结果就是:A 和 B 都关闭,只留下 C。
- 根本原因在于 VSCode 不支持「运行时动态追加工作区文件夹」,只有启动时通过
.code-workspace或code --folder-uri才能真正多根 -
restoreWindows: "all"只管重启恢复,不管命令行合并逻辑 - 远程开发(SSH/WSL)下该行为更明显,因为窗口复用发生在本地 Electron 进程,而文件系统路径在远端
想保留多个项目?别用 -r,改用 .code-workspace
唯一可靠的方式是提前定义多根工作区。VSCode 不会帮你“合并窗口”,但可以让你在一个窗口里同时管理多个不相干的项目。
- 先关闭所有窗口,确保没有残留状态
- 在终端进入你希望作为主目录的位置,运行:
code --new-window --add ./project-A --add ./project-B(注意是--add,不是-r) - 此时会打开一个含两个文件夹的新窗口;立刻执行
File > Save Workspace As…,保存为my-projects.code-workspace - 之后双击这个
.code-workspace文件,或运行code my-projects.code-workspace,就能稳定还原多项目布局
⚠️ 注意:--add 参数仅在窗口为空时有效;如果已有窗口在运行,它会被忽略。
误操作后怎么抢救已丢失的项目窗口
刚合并完、还没关掉旧窗口?立刻按 Ctrl+Shift+P(macOS 为 Cmd+Shift+P),输入并运行:Window: Open Folder in New Window。它会以当前编辑器所在文件夹为根,新开一个窗口——前提是那个文件夹还在磁盘上且未被卸载。
- 如果原窗口已关闭,检查系统最近打开记录:
ls -t ~/.config/Code/Backups/(Linux/macOS)或查看%APPDATA%\Code\Backups\(Windows),里面可能有未清理的临时快照,但无法直接恢复窗口,只能辅助定位路径 - 别去翻
workspaces.json——它只存窗口尺寸和标签页顺序,不存「哪个窗口开了哪个文件夹」 - 最稳的抢救动作是:立刻打开命令面板 → 输入
Developer: Toggle Developer Tools→ Console 标签页里粘贴并回车:JSON.stringify(vscode.window.visibleTextEditors.map(e => e.document.uri.fsPath)),能看到最近编辑过的文件路径,顺藤摸瓜找回文件夹
长期避免这类问题的关键配置
很多人以为改个设置就能让 -r 自动变聪明,其实不能。真正起作用的是两个明确约束:
- 把
"window.openFoldersInNewWindow": false改成true—— 这样双击文件夹时不会强行复用,而是新建窗口(适合多项目并行) - 禁用
"window.openWithoutArgumentsInNewWindow": true(默认为 true),否则从 Dock/Finder 启动 VSCode 时,哪怕什么参数都不带,也会新建窗口,破坏你精心保存的.code-workspace流程 - 永远不要依赖「拖拽文件夹到 Dock 图标」来打开项目——这个行为绕过所有配置,直连 Electron 默认逻辑,必然丢上下文
复杂点在于:VSCode 的窗口模型本质上是单实例 + 多文档,它没有「窗口栈」概念。所谓「合并」,只是进程间通信触发的一次性覆盖。想稳住多个项目,就得放弃窗口合并幻想,转向 workspace 文件驱动的工作流。











