Rime 处理这个问题的标准答案是使用「模糊音」。
speller/algebra/+:
- derive/^([zcs])h/$1/ # z, c, s => zh, ch, sh
- derive/^([zcs])([^h])/$1h$2/ # zh, ch, sh => z, c, s
- derive/([aeio])n$/$1ng/ # ang, eng, ing, ong => an, en, in, on
- derive/([aeio])ng$/$1n/ # an, en, in, on => ang, eng, ing, ong
- derive/([iu])a(o|ng?)$/a$1$2/ # tain => tian
---------
启用模糊音会带来两个问题:
1. 候选词数目会大量增加。如“zhangk”会候选「展开」,不过我还没有体感到候选条目增加引起的性能卡顿;
2. 增加的候选词可能会带来预料之外的词频排序。还是“zhangk”,我机器上「展开」会排在「掌控」前面。
因为我用的是全拼,所以写了一个根据输入编码和候选词拼音匹配程度重新排序的插件,也算处理掉这个问题了。
https://github.com/HuangJian/rime-frost/blob/hj/js/sort_by_pinyin.js