有朋友提了个 issue 后发现的,Rime 实现全拼双拼混输很简单,只要在拼写运算 speller/algebra 下把 xform 替换为 derive 就可以了。

非常适合初学双拼时使用。


原理

例如小鹤双拼的 z 键:

- xform/(.)ou$/$1Ⓩ/
- xlit/Ⓩ/z/

ou 最终转为了韵母的 z,输入 zz 就可以得到「走 zou」了,xform(变形)不保留原型,(.)ou 就没了,改为保留原型的 abbrev(派生)就可以同时支持全拼和双拼了。(官方文档 - 拼写运算的运算子

解决副作用

显示效果

为了全拼双拼混输的显示效果,也要清空 translator/preedit_format 中对双拼转全拼的转换。

ong 音的冲突

如果词库中有 唵嘛呢叭咪吽 ong ma ni bei mei hong,其中的这个 ong 与小鹤的默认规则冲突,修改一下就好了:

-   - derive/i?ong$/Ⓢ/
+   - derive/(.)i?ong$/$1Ⓢ/

全拼与双拼的冲突

例如全拼的 jing(静)与小鹤双拼的 ji’ng(技能),Rime 默认 jing 永远排在 ji’ng 前面,这不太符合双拼为主的情况。

正好可以用长词优先 long_word_filter.lua 将「技能」提到「静」的前面。

示例

雾凇拼音 - 小鹤双拼的补丁示例:

# double_pinyin_flypy.custom.yaml
patch:
  # 在 engine/filters 插入长词优先的 Lua
  engine/filters:
    - lua_filter@corrector
    - reverse_lookup_filter@radical_reverse_lookup
    - lua_filter@search@radical_pinyin
    - lua_filter@autocap_filter
    - lua_filter@pin_cand_filter
    - lua_filter@long_word_filter  # 增加长词优先
    - simplifier@emoji
    - simplifier@traditionalize
    - lua_filter@reduce_english_filter
    - uniquifier

  # 长词优先设置为提升 10 个词到第 1 个位置
  long_word_filter:
    count: 10
    idx: 1

  # 双拼不转换为全拼编码
  translator/preedit_format: []

  # xform 变形改为 derive 派生
  speller/algebra:
    - derive/^([jqxy])u$/$1v/
    - derive/^([aoe])([ioun])$/$1$1$2/
    - derive/^([aoe])(ng)?$/$1$1$2/
    - derive/iu$/Ⓠ/
    - derive/(.)ei$/$1Ⓦ/
    - derive/uan$/Ⓡ/
    - derive/[uv]e$/Ⓣ/
    - derive/un$/Ⓨ/
    - derive/^sh/Ⓤ/
    - derive/^ch/Ⓘ/
    - derive/^zh/Ⓥ/
    - derive/uo$/Ⓞ/
    - derive/ie$/Ⓟ/
    - derive/(.)i?ong$/$1Ⓢ/
    - derive/ing$|uai$/Ⓚ/
    - derive/(.)ai$/$1Ⓓ/
    - derive/(.)en$/$1Ⓕ/
    - derive/(.)eng$/$1Ⓖ/
    - derive/[iu]ang$/Ⓛ/
    - derive/(.)ang$/$1Ⓗ/
    - derive/ian$/Ⓜ/
    - derive/(.)an$/$1Ⓙ/
    - derive/(.)ou$/$1Ⓩ/
    - derive/[iu]a$/Ⓧ/
    - derive/iao$/Ⓝ/
    - derive/(.)ao$/$1Ⓒ/
    - derive/ui$/Ⓥ/
    - derive/in$/Ⓑ/
    - xlit/ⓆⓌⓇⓉⓎⓊⒾⓄⓅⓈⒹⒻⒼⒽⒿⓀⓁⓏⓍⒸⓋⒷⓃⓂ/qwrtyuiopsdfghjklzxcvbnm/

效果展示:

2023-11-20-002011