共享终端资源管理器跨电脑共享 devbox 上的终端:换台电脑接回来,历史还在、滚动无损。 在左侧「共享终端」视图里新建/接入终端,它们跑在 devbox 的 zellij 里 —— 关掉 VS Code 窗口、 换到另一台电脑,点同一行就接回同一个终端,正在跑的进程没有中断。 为什么不是直接
|
| 方案 | attach 期间滚动 | 换电脑后历史 |
|---|---|---|
tmux attach |
❌ 进 alt-screen,滚轮废掉、要进 copy-mode | ✅ |
dtach |
✅ 透明字节管道 | ❌ 0 scrollback |
| VS Code 原生终端 | ✅ 原生 | ❌ 关窗即杀进程 |
| 本扩展 | ✅ 内联写进 xterm.js | ✅ 接入时灌入历史 |
做法是用 Pseudoterminal 把 zellij pane 的内容内联渲染进 VS Code 终端 ——
不进 alt-screen(实测 ESC[?1049h 计数为 0),所以滚轮、选中、查找都是 VS Code 原生的。
要求
- devbox 上装了 zellij,锚定 0.45.0(0.44.3 亦可)
- zellij 需带 web server 能力(官方 release 默认带)—— 用于精确对齐终端宽度。 没有也能跑,会自动回退到受控 pty 方案
用法
- 打开左侧活动栏的「共享终端」
- 点
+新建共享终端(入口目录 = 工作区第一根;也可以在某个文件夹行点+建到该目录) - 终端列表按入口目录分文件夹展示(视图标题栏可切换平铺/分组);目录随 zellij 会话
持久,换电脑接回后分组不丢,pane 里
cd不影响归属 - 换台电脑连同一个 devbox -> 列表里是同一批终端 -> 点行接回来
关掉终端标签页不会杀掉 devbox 上的进程 —— 那正是「换电脑接回来」的实现方式。 要真正销毁,用 zellij 自己的命令。
配置
| 配置项 | 默认 | 说明 |
|---|---|---|
terminalExplorer.sessionName |
shared |
承载所有共享终端的 zellij 会话名 |
terminalExplorer.scrollbackLines |
5000 |
接入时灌入的历史行数 |
terminalExplorer.useWebClient |
true |
用 zellij web server 精确对齐宽度(见下) |
terminalExplorer.webPort |
8082 |
web server 端口,仅监听 127.0.0.1 |
关于 web server:zellij 没有「按列数设尺寸」的命令,而无客户端连接时它的视口是固定的 50 列。要让 pane 宽度跟 VS Code 终端对齐(否则输出的换行位置会错乱),唯一办法是以 常规客户端身份连上去 —— 扩展为此按需拉起 zellij 自带的 web server,只在本机回环地址监听, 认证 token 存在 VS Code 的 secrets 里。不想用可以关掉,会回退到精度略低但可用的方案。
已知边界
- 暴涨输出时的实时逐行动画会丢帧:zellij 把渲染 debounce 到每 10ms 一次, 窗口内的多次变化合并成一帧。不影响最终内容与历史 —— 接入时灌入的 scrollback 是完整的(实测 300 行零缺失)
- 不提供普通本地终端:点新建一律开共享终端,心智模型统一
- 不支持分屏:一个 VS Code 终端 = zellij 里一个独占 tab,分屏交给 VS Code 自己
开发
npm install
npm test # tsc + 编译 + 单测 + 两套真机验证
npm run test:ci # 只跑 headless(CI 用)
# F5 开扩展开发宿主
设计决策与实测前提见 docs/plan.md,逐文件说明见 docs/architecture.md。
License
MIT