C6.10.3Autocomplete must not rewrite committed text设计研究
补全不得改变已确认的输入
别名: 补全不改写 · 已确认文本 · 幽灵文字
概念解释
补全是对尚未写入的后继给出建议:前缀保持原样,后继可被接受或忽略。用户已经用空格、回车、点选候选或移走焦点确认过的字符串,补全不应回头改写。改写已确认文本是另一件事(自动纠错),混进补全会让“我只是看了一眼建议”变成“我已经打出去的词被换掉”。
机制
输入流里有一条确认边界:边界之前是组合中的前缀,边界之后是提交进文档的文本。补全只应作用在边界之前——幽灵文字叠在前缀后面,或候选条展示“若接受则会变成什么”。一旦空格把词送过边界,这条词就离开补全的管辖。若补全逻辑仍监听文档里的上一个词,并根据后面将要打的字母回头替换它,用户看到的是一份自己没有签署过的修改。确认边界还保护粘贴进来的整段、以及从另一条候选明确点选写入的词:这些都已经是提交,不是前缀。补全可以继续对下一个词出建议,但不许回头碰上一个。
怎么研究
构造“打完并确认 → 再打下一个词的前缀”的序列,记录上一个已确认词的字符是否变化。自变量包括确认方式(空格、点选、失焦)、补全是否跨词、是否与纠错共用同一套模型;因变量包括已确认词被改写的次数和用户是否察觉。把补全和纠错的日志通道分开,才能判断改写来自哪一套。
边界
组合输入(拼音未上屏)里的整段都还在边界之前,补全或选词改的是组合串,不是已确认文本。语法级的自动套改(另有机制)若发生在确认之后,应走纠错或格式化的可见通道,不得挂在补全接口上。协作文档里别人对同一段的编辑不是补全,不要用这条去禁协作。
怎么落地
- 把补全的作用域限制在当前未确认前缀;空格、回车、明确点选之后,该词从补全的可写集合里移除。
- 幽灵文字不得替换已有字形,只允许画在插入符之后;接受动作是插入,不是替换。
- 回归用例:确认词 A 后开始打词 B 的前缀,A 的每个字符都应保持;任何差分都视为补全越界。