自动换行和多项目:看着是 UI,背后都是状态

自动换行和多项目:看着是 UI,背后都是状态

自动换行、新建窗口、项目标签,乍一看都像是加个菜单选项的功能。

在砚里做起来之后,它们分别牵动了三个基础概念:什么算一行,什么属于一个窗口,什么需要跟着项目保存。

长行折下去,光标也得认识新的一行

自动换行不能只把绘制出的文字分成两段。否则屏幕上看着有两行,方向键、点击和滚动仍然按原来的一行算,体验马上就会错位。

砚为此区分逻辑行与视觉行。文件里的换行符决定逻辑行,窗口宽度决定一条逻辑行折成多少条视觉行。

text 复制代码
文件中的第 12 行
    ↓ 当前栏宽
视觉行 12.0:显示行号 12
视觉行 12.1:续行,不重复显示行号
视觉行 12.2:续行

上下移动、翻页、鼠标命中和滚动,要在视觉行与字节位置之间转换。换行时利用空格和中文字符之间的断点,开关用 Alt+Z,状态会记住,也支持配置。

当前仍有细节没统一:alpha.4 说明明确提到 Home/End 和 Vim 的 j/k 仍按完整逻辑行工作。把这个差异写出来,才不会让"支持自动换行"看起来比实际更完整。

多窗口意味着多个独立工作区

窗口版加入新建窗口后,每个窗口都有自己的文件夹、标签和终端。菜单跟随前台窗口,关闭其中一个,不应把其他窗口一并结束。

这些约束比打开第二个窗口本身更重要。菜单命令的目标必须正确,终端归属也不能串,应用退出和窗口关闭还要分开处理。

发布记录里,用原生 selftest 验证过新窗口打开、第二个窗口关闭后应用继续运行。它是原生程序中的自动驱动证据,仍然和一轮完整的人手体验测试有区别。

项目标签再往上加一层

后来又做了项目标签:把几个文件夹收进同一个窗口,在左侧用方块表示项目。每个项目保留自己的编辑标签、终端、侧边栏和面板。

开启这个模式时,已有窗口可以合到一个窗口;关闭时,各项目重新分成窗口。打开文件夹、新建窗口命令和项目栏加号,也根据当前模式决定增加项目还是窗口。

这时"项目状态"和"承载它的窗口"就必须分开。否则移动项目时,最容易丢的是终端、滚动位置或面板展开状态。

项目列表会在后续启动时恢复。这里的恢复不能理解成退出后仍保留原 shell 进程;会话恢复与一个进程持续运行是不同能力。

alpha.5 补上顺序和提醒

项目多起来后,位置很重要。alpha.5 支持拖动方块调整顺序,也会标出隐藏项目中终端发来的响铃或通知。

这样在 A 项目里看代码时,B 项目的终端完成一项任务,就有一个不必切过去也能看到的提示。这部分和终端联动,后面单独展开。

窄窗口不能什么都硬塞

同一阶段还处理了状态栏和标题命令中心在窄窗口下的表现。

状态栏放不下时按保留优先级省略内容,编码先让位,位置信息更晚省略。命令中心先不显示文件夹,再考虑缩短文件名。

这比统一加省略号更接近使用需求:用户在窄窗口里仍然最需要知道正在看哪个文件、光标在哪里。

这些变化之后,窗口管理有了更灵活的形态,但多窗口设置传播仍存在限制,不能假定在一个窗口改设置,所有既有窗口都会立即同步。

做完这一轮,我更能理解为什么编辑器里很多看似小的功能要做很久:真正要保持一致的,是显示、输入、保存和恢复背后的同一套状态。


相关推荐
Patrick_Wilson1 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
Patrick_Wilson2 小时前
从文本输出理解 Go 方法与接口
后端·go·编程语言
Patrick_Wilson7 小时前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
Patrick_Wilson7 小时前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言
Patrick_Wilson7 小时前
执行 go build . 后,Go 怎样找到代码并生成程序
后端·go·编程语言
Patrick_Wilson7 小时前
Go 变量不赋值时,为什么也有值
后端·go·编程语言
Patrick_Wilson7 小时前
读 Go 项目里的命令:run、build、test 分别做了什么
后端·go·编程语言
vipxieliang12 小时前
Go GC 性能优化实践:从 GOGC、GOMEMLIMIT 到分配热点定位
go
孔令飞12 小时前
很多人想学AI Infra,今天推荐一个 AI Agent / AI Infra 学习路线
云原生·go·ai编程
我不会起名字3221 天前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单