复活 ABC 输入法
内容提要
作者研究用 RIME 复刻智能ABC输入法。RIME 将输入流程分为 processor、segmentor、translator、filter 四阶段,多数方案靠配置即可,但ABC交互特殊:以短语为单位输入,需在输入态与编辑态间切换,数字编码与选字冲突,还需中括号选词、i/u/v 前缀等特性,难以纯配置实现。作者用自定义 translator 和 filter 实现音形码混合,并指出形码仅用1-8可用数字区间比较匹配前缀。
延伸解读
RIME 四阶段架构的定制逻辑
RIME 将输入法流程拆分为 processor、segmentor、translator、filter 四个阶段,各阶段职责明确:processor 处理按键交互并维护全局 context;segmentor 将输入流切分为带 tag 的数据块;translator 按 tag 分发并生成候选;filter 对候选进行过滤。这种设计允许开发者通过组合模块实现复杂输入方案,但需注意 translator 之间不依赖配置顺序,且每个 translator 按需返回单个候选,由框架整合。
智能 ABC 交互与 RIME 编辑模式的冲突
智能 ABC 以短语为单位输入,接近 RIME 的 express_editor 模式,但又需要单字构词等编辑功能,类似 fluid_editor。其数字编码与数字选字冲突,原版通过输入态与编辑态分离解决:空格前可输入数字但不可选词,空格后可选词但不可修改输入串。在 RIME 中复刻时,需自定义 processor 来管理状态切换,纯配置难以实现。
音形码混合的自定义实现方案
作者采用自定义 translator 和 filter 实现音形码混合:translator 先剥离数字形码,调用官方拼音 translator 解析纯音码,得到包含冗余的候选;再由 filter 检查候选的形码是否匹配用户输入,剔除不匹配项。这种方法避免了外部脚本合并词库,但依赖对候选数据的二次处理,可能增加计算开销。
形码数字区间匹配的巧用
智能 ABC 形码仅使用 1-8,作者发现可将前缀匹配转化为数字区间比较:将用户输入的前缀补零至 6 位(如 38 变为 380000),将完整编码也补零至 6 位(如 38135 变为 381350),若完整编码落在前缀区间内则匹配成功。这种方法简化了前缀判断逻辑,但仅适用于纯数字编码且位数固定的场景。
Q&A
RIME 输入法的处理流程分为哪几个阶段?
RIME 将输入法流程分为四个阶段:processor、segmentor、translator、filter。processor 处理按键交互并生成输入串;segmentor 将输入信息转换为带 tag 的数据块;translator 按 tag 分发处理并生成备选结果;filter 对结果进行过滤。
为什么智能 ABC 输入法难以用 RIME 的纯配置实现?
智能 ABC 的交互特殊:以短语为单位输入,需在输入态与编辑态间切换,数字编码与选字冲突,还需中括号选词、i/u/v 前缀等特性,这些难以通过现有配置项完全解决,需要自定义 processor 等模块。
智能 ABC 中 i、u、v 前缀有什么作用?在 RIME 中如何实现?
i、u、v 是特殊前缀,用于输入数字、符号等,例如 i2026n 输出二〇二六年,i4s2cm 输出四十二厘米,I123 输出大写壹贰叁。在 RIME 中可以直接用模式匹配实现。
智能 ABC 的中括号选词功能是什么?在 RIME 中如何实现比较好?
中括号选词是 ABC 的特色,打单字时加 [] 后缀可只输出词的首字或末字,用于去同音字。在 RIME 中较贴切的方法是定义 segmentor 给这种输出片段贴上正确 tag,而不是将中括号编码在输入串中,便于后续 translator 处理。
在 RIME 中如何实现智能 ABC 的音形码混合输入?
作者采用自定义 translator 和 filter 的方案:translator 先去掉输入中的数字形码,调用官方拼音 translator 解析纯音码,得到冗余选项;再用自定义 filter 检查选项中的形码,去掉不匹配的,从而得到正确选项集。
智能 ABC 的形码只使用 1-8 数字,这对匹配编码有什么巧妙方法?
由于形码仅用 1-8,可以将前缀匹配转化为数字区间比较。例如编码 38 扩展为 380000,完整编码 38135 扩展为 381350,因为 381350 在 380000 和 389999 之间,所以 38 匹配该编码。
智能 ABC 的输入态和编辑态是如何切换的?为什么需要这样设计?
按空格前为输入态,可输入数字但不能选词;按空格后进入编辑态,不能修改已输入串,但允许数字键选词。这样设计是为了解决数字编码与数字键选字的冲突。