C6.16.2Correction and completion as undo units设计研究
自动纠错与补全应作为独立可撤销单元
别名: 纠错入撤销栈 · 补全入撤销栈 · 独立撤销项
概念解释
系统主动写入的那一段——纠错换上的词、补全接上的后继——应当在撤销栈里占单独一项,不要和前后的手打字母并成同一个组块。撤销一次,只拿掉系统写的那部分,手打的前缀或后词留下。若并进同一项,用户为了去掉一次误纠错,会连自己刚打的词一起撤掉。
机制
手打、纠错、补全是三类作者。栈若只按时间把它们熔进“当前词”,作者信息丢失:撤销无法对准“系统做的那一下”。纠错发生在空格边界上,表面上像词的一部分,其实是一次替换命令;补全发生在点选或 Tab 上,是一次插入命令。两者都应像粘贴一样入栈。独立项还让“撤销纠错”不必依赖纠错自己的专用退格手势——专用手势可以仍在,但通用撤销必须能做到同一件事,否则只会用撤销的人没有退路。熔合的失败很典型:打完前缀、接受补全、再按撤销,整个词消失,用户只是想把补全的尾巴拿掉。
怎么研究
构造“手打前缀 → 系统替换或补全 → 再手打下一词”,然后只按一次撤销,看文档停在哪。自变量包括纠错与补全是否单独入栈、撤销是否与退格共用。因变量包括是否保留前缀、是否误删下一词、用户是否认为这次撤销对准了系统动作。不要把“点纠错标记恢复”算进这条:那是纠错控件,不是撤销栈。
边界
幽灵文字尚未接受时,没有写入,不应入栈。用户明确点选的输入法候选是确认过的写入,可以视为一项插入,与纠错不同,但同样不应和前后击键熔合。关闭纠错与补全的字段没有这些项。协作中他人的自动更正不应出现在我的栈里。
怎么落地
- 每次静默替换和每次接受补全各压一条撤销记录,记录里保存被替换或被插入的区间。
- 一次撤销的结果应是:前缀仍在、系统写入消失;用“打前缀—接受补全—撤销”验收。
- 通用撤销与纠错标记上的恢复应对准同一原串,避免两条路径回到不同文本。