自动换行和多项目:看着是 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 项目的终端完成一项任务,就有一个不必切过去也能看到的提示。这部分和终端联动,后面单独展开。
窄窗口不能什么都硬塞
同一阶段还处理了状态栏和标题命令中心在窄窗口下的表现。
状态栏放不下时按保留优先级省略内容,编码先让位,位置信息更晚省略。命令中心先不显示文件夹,再考虑缩短文件名。
这比统一加省略号更接近使用需求:用户在窄窗口里仍然最需要知道正在看哪个文件、光标在哪里。
这些变化之后,窗口管理有了更灵活的形态,但多窗口设置传播仍存在限制,不能假定在一个窗口改设置,所有既有窗口都会立即同步。
做完这一轮,我更能理解为什么编辑器里很多看似小的功能要做很久:真正要保持一致的,是显示、输入、保存和恢复背后的同一套状态。