把终端拖进编辑区,别把正在跑的 shell 弄丢了

把终端拖进编辑区,别把正在跑的 shell 弄丢了

砚之前把终端放在底部面板。跑几条命令够用,但一边看代码、一边持续看构建输出,左右并排会更舒服。

所以这轮让终端也能成为编辑区的标签。可以直接新建,也可以把面板里的终端拖进去,再拖回来。功能后来进了 alpha.8。

这里有个要求我很在意:位置换了,里面正在跑的命令不能跟着没了。

名字一样,也可能是两个终端

同一个项目可以开两个都叫 zsh 的终端,一个跑服务,一个跑检查。目录和标题都一样,显然不能靠这两个字段认人。

每个终端标签因此有独立 ID。内核记录它的目录、标题和布局位置,窗口前端保管实际终端对象及连接。这样移动或关闭时能找对对象,内核也不用依赖终端模拟器。

不过"保留会话"不能覆盖所有操作。我把它们分开处理:

操作 shell 怎么处理
面板与编辑区之间互移 原 shell 继续运行
拖到另一列或列边缘 移动原来的会话
执行拆分命令 在同一目录新建 shell
关闭后重新打开 新建 shell
重启应用后恢复布局 按保存的目录新建 shell

拖到边缘和执行拆分,最后看起来都多了一列,背后的动作却不同。前者搬走原对象,后者开一个新终端。

重启恢复也只恢复布局与启动目录,不能把上次的进程和环境原样带回来。

标签关了,消息可能还在路上

终端会不断送来输出、标题变化和退出事件。关掉标签的那一刻,队列里可能还有没处理的回调。

窗口层要记住终端已经关闭,让晚到的标题和退出事件停下来,并释放原来的连接。shell 自己退出时也会移除标签,但不会把它放进"最近关闭",免得恢复出一个已经自然结束的任务。

启动失败则留住失败状态,允许正常关闭。否则绘制代码发现"还没有终端对象",每画一帧又启动一次,就会变成不断重试。

这部分代码没什么可截图的,但关标签是否干净,靠的就是这些处理。

亮着的标签,不一定拿到了键盘

文件切到终端、终端切回文件、跨列切换,都得把输入送给当前对象。

查找框尤其容易漏:它已经隐藏,焦点却可能还留着。看起来终端在前面,敲下的字却进了查找条件。

因此测试不能只看哪个标签被选中,还得真的送入按键,检查文件、终端或查找框到底谁收到了。

拖文件进去,应该输入一条能用的路径

文件落在编辑器正文里是打开文件,落在终端正文里则是输入路径。列边缘另设分栏落点,不能让它盖住整个终端,把输入路径的动作也抢走。

路径有空格、单引号时,还得按 shell 的规则处理。现在 macOS/Linux 走 POSIX 引号规则,Windows 辅助函数预留了 PowerShell 处理。自定义 shell 要另看,cmd.exe 也需要单独适配;Windows 窗口版当时还没有交付。

验证这块用了几种办法:内核测移动、拆分和恢复;无头 GUI 测拖动、释放资源和失败状态;集成测试加载真实终端模拟器,用模拟连接检查输出有没有丢、输入有没有送对。

10 月 15 日的记录里还做过 macOS 原生窗口检查,跑 shell 命令、互移终端、调整大小、按 Ctrl+C、关闭退出。Finder 实际拖入和系统输入法候选窗,当时仍没做人工验证。

这轮之后,代码可以在左边,终端在右边,底部面板留给别的任务。摆法随时能换,正在运行的那份工作留在原来的会话里。

下载试用

本文这批布局和终端功能后来进入 alpha.8。下面提供后续公开版本的安装包。

2026-10-19 补充:公开安装包为 v0.1.0-alpha.14 ,适用于 macOS 13+、Apple Silicon(M 系列芯片)。

安装包目前尚未经过 Apple 公证,首次打开的说明见发布页。


仓库留档

相关推荐
孔令飞2 小时前
企业智能化升级:智能体平台设计和实现
云原生·go·ai编程
vipxieliang5 小时前
Go GC 性能优化实践:从 GOGC、GOMEMLIMIT 到分配优化
后端·go
小满zs1 天前
Go语言第十八章(架构设计)
后端·go
FungLeo2 天前
成为全栈·Go 后端篇·三轮代码审阅之后:把可读性和证据做成工程规则
golang·go·ast·静态检查·成为全栈·代码审阅
我不会起名字3222 天前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
xyzzklk2 天前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
vipxieliang3 天前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
我不会起名字3224 天前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
我不会起名字3224 天前
Redis 从 0 到 1(二十三):一个热 key 打到 10 万 QPS——hotkey 与本地缓存的 Go 实现
redis·缓存·go·qps·hotkey
Patrick_Wilson5 天前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言