自动换行和多项目:看着是 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 项目的终端完成一项任务,就有一个不必切过去也能看到的提示。这部分和终端联动,后面单独展开。

窄窗口不能什么都硬塞

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

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

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

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

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


相关推荐
敲代码的玉米C1 小时前
第一次打出 DMG:能运行,离能发布还有多远
go
敲代码的玉米C1 小时前
功能越多,越要小心那一次保存和替换
go
我的div丢了肿么办6 小时前
go语言通过反射来操作结构体中的数据
后端·go
人人都是软件工程师6 小时前
16-并发编程(下):channel、select 与同步原语
go
猪猪拆迁队1 天前
跨电脑复制共享-局域网直连踩坑
前端·后端·go
tachibana21 天前
Go 语言的 Map 是否是并发安全的?
开发语言·数据结构·后端·golang·go·语言
tachibana21 天前
Go 语言 Map 的扩容过程是怎样的?
开发语言·后端·golang·go·语言
共饮一杯无1 天前
LiveKit本地录制落盘路径排查与修复实践
java·go·livekit
探索云原生1 天前
KServe 工作流程:从 InferenceService 到 vLLM 服务
docker·ai·云原生·kubernetes·go