🐭 基本介绍
Rime是一个自由的输入法引擎,或框架,它在不同的平台有不同的发行版
- 在mac上叫作鼠须管
- 在linux上叫作中州韵
- 在windows上叫作小狼毫
- 在ios上叫作小仓输入法 Rime是一个自由的输入法框架,通过配置文件载入的「方案」才是狭义上的输入法,这意味着你可以通过框架来构建自己的输入法「方案」,也可以在别人已经构建好的框架上扩展,我就是在雾凇方案上进行扩展的,你可以通过这些方案来:
- 构建自己的中英文词库
- 构建常用语
- 编辑输入法样式(皮肤)
- 编辑每一个按键的功用caps lockshiftetc…
- 更改候选词数量
- 同步多个机器之间的配置
- etc… 这篇文章不会介绍如何配置Rime,只介绍些许Rime工作原理,以及少数输入法的有关概念,和我自己的些许感想,如果你想更深入的了解Rime,还请详阅以下网页内容:
- 雾凇拼音Github仓库可能是目前最好的Rime全拼方案
- Rime简明教程by BaiYun,阅读这篇文章来初步学习如何配置Rime
- 鼠须管输入法配置指引by 哈呜.王,极为详尽的第三方鼠须管配置指引
- Rime官方维基
- Rime本体Gihub仓库
- 方案制作详解通过这个指引来创建自己的输入法方案
- Rime-MacOS-like&Wechat-like换皮样式配置
⚙️ Rime的工作原理
工作流程
下面来看一下Rime输入法的工作流程,来更好的理解这个框架:
按键消息→后台「服务」→分配给对应的「会话」→由「方案选单」或「输入引擎」处理……
通过「方案选单」,Rime可以在不同的会话里选用不同的输入方案(e.g.雾凇全拼、小鹤双拼…),然后将相应的输入方案载入输入引擎,下面是输入引擎的工作流程:
加载输入方案、预备功能组件;各就位之后就进入处理按键消息、处理按键消息……的循环
处理按键消息并产生候选词的工作,就由下面四类组件来完成。
四类组件
响应各种按键、产生各类结果的工作,由四类不同的功能组件分担,这些组件被定义在输入方案的scheme文件中,如rime的默认方案luna,代码片段如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
luna_pinyin.schema.yaml
…
engine: # 输入引擎标签,下面在引擎上挂载所需组件 processors: # 一、这批组件处理各类按键消息 - ascii_composer # ※ 处理英文模式及中英文切换 - recognizer # ※ 与 matcher 搭配,处理符合特定规则的输入码,如网址、反查等 - key_binder # ※ 在特定条件下将按键绑定到其他按键,如重定义逗号、句号为候选翻页键 - speller # ※ 拼写处理器,接受字符按键,编辑输入码 - punctuator # ※ 断句处理器,将单个字符按键直接映射为文字符号 - selector # ※ 选字处理器,处理数字选字键、上、下候选定位、换页键 - navigator # ※ 处理输入栏内的光标移动键 - express_editor # ※ 编辑器,处理空格、回车上屏、回退键等 segmentors: # 二、这批组件识别不同内容类型,将输入码分段(e.g.分开123 abc , .) - ascii_segmentor # ※ 标识英文段落 - matcher # ※ 标识符合特定规则的段落,如网址、反查等 - abc_segmentor # ※ 标识常规的文字段落 - punct_segmentor # ※ 标识断句 - fallback_segmentor # ※ 回退标识未标记的段落 translators: # 三、这批组件翻译特定类型的编码段为一组候选文字 - echo_translator # ※ 没有其他候选字时,直接显示输入码 - punct_translator # ※ 转换标点符号 - script_translator # ※ 脚本翻译器,用于拼音等基于音节表的输入方案 - reverse_lookup_translator # ※ 反查翻译器,用另一种编码方案查码 filters: # 四、这批组件过滤翻译的结果 - simplifier # ※ 繁简转换 - uniquifier # ※ 过滤重复的候选字,有可能来自繁简转换
processors
- 这一系列组件会对用户输入依次进行处理,按照预设的规则对按键进行响应,它有以下这些行为:要么忽略,不对该按键做任何响应,使用系统默认操作要么处理,即「Processors」中有一个处理器可以处理该按键,并执行对应操作要么不处理,将用户输入传入下一个「processor」,看它能不能处理
- 优先级是按配置文件中的列表顺序排列的
- 「processors」最常见的处理——将按键所产生的字符记入上下文中的「输入码」序列,当「输入码」发生变更时,「seqmentors」就开始新一轮处理
Segmentors
- 这些组件通过一些规则,将「输入码」按照文字、数字、符号等不同内容分段,并分而治之。如将「mac电脑」拆分为「mac」和「电脑」,并为这些分段打上标签,这样就不会打出「马车电脑」,从而实现了中英混输「输入码」分段是通过多轮代码段划分操作完成的每一轮操作中,一众「segmentors」分别给出起始于某一处、符合特定格式的代码段,识别到的最长代码段即本轮的分段结果,例如从“observe观察”分离出的“ob”和“observe”之间会选取最长的“observe”作为正确的分段结果分好段后就开始给段落贴标签,这些标签是初步划分后判定的类型,可能存在一个编码段贴多个标签的情况,接下来由「translators」把特定类型的编码段翻译为文字
Translators
- 翻译器系列组件完成由编码到文字的翻译
- 以下是几个需要注意的要点翻译的对象是「Segmentors」划分好的一个代码段;某个「translator」组件往往只翻译具有特定标签的代码段;翻译的结果可能有多条,每条结果成为一个展现给用户的候选项;代码段可由几种translator分别翻译、翻译结果按一定规则合并成一列候选;候选项所对应的编码未必是整个代码段。用拼音敲一个词组时,词组后面继续列出单字候选,即是此例;
- 内存中翻译器结果是这种样子:12345input | tag | translations------+--------+-------------------------------------2012 | number | [ “2012” ], [ “二〇一二” ]nian | abc | [ “年”, “念”, “唸”,… ], [ “nian” ]\ | punct | [ ”、”, "" ]可见输入串划分为多个代码段,每个代码段又有多组翻译结果,取各段代码段结果的首选结果组合起来就是预备上屏的文字:“2012年、”
- 有两种主要的「translator」script_translator 罗马字分析法table_translator 码表分析法
- 拼音、注音、方言拼音,皆是以固定音节表上的拼写排列组合的方式产生编码,故适用罗马字分析法。
- 仓颉、五笔字型这类则是传统的码表输入法
- 马字式输入方案以一组固定的基本音节码创造新的组合而构词,而码表式输入方案则以一定码长为限创造新的编码映射而构词
Filters
「Filter」即过滤器,它会在当需要在界面上显示一页候选项时,从前面步骤已经收集到的翻译结果中进行筛选。然后从最后一个代码段的翻译结果集开始,一直向前挑选,直到满足设定的最大候选项数(页数限制)。
每从结果集选出一条字词,会经过一组「filters」过滤,多个「filter」串行工作,最终产出的结果哦进入候选序列
filter可以:
- 改装正在处理的候选项,修改某些属性值
- 消除当前候选项,比如检测到重复(由不同translator产生)的候选条目
- 插入新的候选项,比如根据已有条目插入关联的结果
- 修改已有的候选序列 通过这四类组件,Rime和输入方案完成从用户输入到上屏字符的转换。
一些和输入法有关的名词
- 上屏即把选中的候选词或符号输入到文本框中
- 双拼双拼是汉语拼音输入法的一种编码方案。相对于全拼而言,使用双拼输入汉字时只需输入一个代表声母的字母,一个代表韵母的字母,就可以打出任意一个中文字了以小鹤双拼为例,键盘上的c除了它本身,还代表一个韵母ao,也就是c(ao),想打出hao,就输入h(声母)c(韵母,代表ao),下面是一张小鹤双拼的码表

- 全角/半角全角字符更宽,像这样nihao,而半角字符是这样的nihao,按下⌃ `或F4来修改方案,切换全/半角
- 回显即没有候选结果时,直接显示用户输入

- 反查简单地说就是使用其他输入模式,查找现有输入模式下的字符输入
- 去重去掉候选字词中的重复结果
- 词典即输入拼音所对应的字词,一大串就组合成一个词典,还可以用数字作为权重来决定他们在候选字词中的先后例如- 龙腾虎跃 long teng hu yue 1000
- 候选词根据用户输入得出的候选字词
- 短语由用户定义的一系列常用短语,可以是口头禅、邮箱、电话等如有 u 3
想
如你所见,这个自由输入法比起同类型的其他——多半是大厂开发的免费输入法相比,配置项繁杂许多,且这些配置没有任何GUI界面可供调参,而是需要你打开其配置文件,通过纯文本的形式修改,一旦填写不符合规范,重新部署的时候就会报错,“列之间须用缩进分开,列之内须用空格分开”,而你还必须阅读其冗长的文档,去搞清楚每个配置文件乃至每个配置项的功用,才能得心应手的调参…若不满足于挪用别人调试好的输入法方案,想要创造自己的方案,则要花更多时间去研究Rime的文档,而其文档在很多方面的描述令人困惑,要花些时间来理解。
我花了一个下午的时间去看关于Rime的各种博客和wiki、调整雾凇拼音的各项配置,最终得到了一个相对可用性比较高的效果,但还是不及我之前使用的微信输入法提供的免费且原生的体验,主要体现在Rime翻页候选词时,没有下拉菜单来展示更多页的候选词,其次还是微信输入法提供了更多好用的功能,而且都可以在一个简约的GUI界面上进行调整…
微信输入法和Rime都是免费的,但前者是专有软件,后者是自由软件;然而一个免费的专有软件如何为公司创造价值?恐怕答案只有获取用户信息来做个性化推荐和AI训练语料之类,资本不逐利就不是资本,虽然微信输入法推出了离线模式,不过大概多数人都会用隐私换便利,毕竟只要保持在线模式,就可以使用微信输入法免费提供的ai问答功能和多设备同步剪贴板/常用语,还可以获取实时的网络热门词库,这样不管网络上有哪些时髦的热词热梗,你都能第一时间准确打出来,而不用通过多次的输入来创建自造词并提升它的权重,听起来很美好,并且需要你支付的也只是不值一提的个人隐私罢了。
有人说「自由」软件才是真正的「免费」软件,虽然free一词在英文中有这二者的双重含义,但通常用libre一词来形容「自由」,「自由」软件不是简单的开放源代码的软件,根据自由软件基金会对其的定义,「自由」软件是一类可以不受限制地自由使用、复制、研究、修改和分发的,尊重用户自由的软件。这方面的不受限制正是「自由」软件最重要的本质。但是「自由」难道就没有代价吗?Rime的输入法方案配置就尽显「自由」,只要你的xxx.scheme.yaml中的配置项符合Rime文档的要求,那就可以随意配置,词库也是自由的,当你输入zy,首选候选词可以是自由也可以是专有,一切全看用户配置,如果想自己开发一个基于Rime的商业软件,也是允许的,例如ios平台上的仓颉输入法,它是有内购的。但这一切的前提是你需要花费阅读文档、编辑配置文件、配置词库的时间,而假使你选择用隐私去换国内大厂免费提供的输入法,上述的时间都可以省下来,如果你愿意,还可以轻松换上精美的皮肤,而不像Rime要自己通过代码制作。如果说「免费」的代价是隐式的分摊给用户的,那么「自由」的代价则直接由开发者承担,并通过价值差映射到用户。对于自由软件,用户有付费的自由,即使选择向开发者付费,也只是通过捐赠的形式,人的自私是写在基因里的,这就是为什么视频网站上的一众知识类视频的收藏数普遍比点赞数要高,大部分人只顾自己,这也是为什么自由软件永久无法流行起来,一个无法盈利的软件,开发者是没有动力去完善它的,而其门槛也注定很高,这种早期的软件分享的形式,其传播范围也只有程序员群体,因此注定是小众的,Rime得以为继的一个主要原因是它只是一个输入法框架,它只提供一个默认的输入法方案,并且称不上好用,最终还是需要用户基于此框架建立自己的输入法方案,所幸已经有了雾凇输入法这样的优秀全拼方案,其他人需要做的也只有安装对应平台的Rime,并将雾凇输入法的配置文件拖到自己的Rime用户配置里,然而要想媲美大厂输入法提供的体验还有些路要走,这也就是所谓的价值差,自由软件永远无法提供比商业化的私有软件更高的价值,这里的价值是这样计算的:受益人数、人均受益时间、单位时间价值,这个价值公式来自李沐,可以用来计算每件事的价值,即使并不具体,但是可以很轻易地判断二者之间的价值孰高孰低,我现在正在使用Rime,不过除隐私以外,我并不觉得它给我提供了比微信输入法更高的价值,在使用Rime之前,我就知道这是必然的,但我为什么还要使用它?是为了隐私吗?对于我来说不是的,虽然我很重视隐私,但这里有一个平衡,即绝对的隐私和互联网带来的便利是互斥的,前者最极端的情况是:注销所有的社交平台账号,用tor、librewolf这样极端注重隐私的浏览器,不使用任何联网的私有软件,etc… 可以想见这样的生活有多麻烦,所以对于我来说牺牲一小部分利益,来换取一定程度的便利,是划算的买卖。
结
天平一端高一端就低,不论倾向于哪边,在最理想的情况下,隐私和便利是等价交换的,也就是说所牺牲的隐私都会以相应的价值转化为便利,如果真是那样倒也不算太亏,然而大多数情况下,天平「便利」的那一端都被偷偷塞了吸铁石,你需要用更多的隐私来换取原本应该属于你的那部分便利,在这种情况下应该如何抉择?于是我选择了Rime。