小狼毫(Rime)配置生效原理

经朋友种草之后,确实感觉小狼毫/Rime(官网下载链接)是一个很不错的输入法框架,尤其在使用熟练与理解其运行逻辑之后,其高度灵活的配置自由度,及其对插件引擎的支持能力(例如lua),可以非常灵活的打造属于自己的输入法方案,实现真正的定制化。

本人比较笨,也比较懒(由于小狼毫官方制定指南为繁体字页面,我有点密恐,一直抗拒去看官方文档。后来证明,相对于在网上四处看别人给的配置文本,亲自看官方文档才是最高效的上手方式,好尴尬),在折腾的过程中,好久一段时间都不得要领,只会照着网上给定的配置文本复制粘贴,有时候还莫名其妙不起作用,甚至程序异常。

经过一段时间的摸索,终于理解了小狼毫这个程序的配置生效逻辑,其实理解了这个逻辑,在去配置自己的输入法,就有主动权。你在网上看别人给出的配置文本,也能看得会,看得懂,甚至能看出是否有错误,以及如何做出一定的修改以满足自己的需求。

下面关于所谓的小狼毫的配置生效逻辑进行一个说明(以wubi_pinyin输入法为例,其它输入法雷同),有不对的地方,欢迎指正,共勉学习。

我们今天所涉及到的内容,主要有两个文件夹,如下图所示,用户文件夹程序文件夹
小狼毫(Rime)配置生效原理_第1张图片
其中程序文件夹下,我们将主要关注data文件夹下的文档;
小狼毫(Rime)配置生效原理_第2张图片
其中用户文件夹下,我们将关注此文件夹下的文档以及其子文件夹build下的文档;
小狼毫(Rime)配置生效原理_第3张图片
程序文件夹下的yaml文档,其中各项配置参数都是程序提供的原始配置值,可以确保在最糟糕的情况下使用此配置时,程序可以运行。我们称这里的配置为 S(source)配置,这里的文件一般是不需要修改的。

用户文件夹下子文件夹build文件内,也有一套与程序文件夹下类似的同名yaml文档,此处的配置决定的程序 运行的实际效果,是融合了用户自定义配置之后的配置,我们称这里的配置为 T(target)配置,这里的文件是运行重新部署之后生成的配置文件。
也就是说每次用户修改了配置之后,都需要运行重新部署,才能将所做的修改整合进 T 配置中,以使其生效。
小狼毫(Rime)配置生效原理_第4张图片
用户文件夹下,还有一些带有custom字样的yaml文档或者txt文档,这些文档的作用是提供一个接口,使用户可以对程序的运行效果进行定制,我们称些处的配置为 C(custom)配置。
小狼毫(Rime)配置生效原理_第5张图片
有了 S T C 三种配置之后,在运行重新部署之后,他们之间是如何相互起作用的呢?(这里是重点
有时候文字费劲儿且效果不佳,直接看下面的图吧。
小狼毫(Rime)配置生效原理_第6张图片
对于上图我相信大家可以轻易理解小狼毫的三个配置文件在运行重新部署后的相互作用关系。这些关系中,最核心的点在于打补丁这个动作,是这个动作将我们个性化的配置融合到了build文件夹下的配置文档中,并影响了程序的实际运行效果。

下图是在没有 C 配置下 wubi_pinyin.custom.yaml 文档时,部署程序所生成的 T 配置下的 wubi_pinyin.schema.yaml 文档中的engine信息。(yaml文档的结构和语法此处不展开讨论)
可以看到engine结构下有processors, segmentors,translators三个子结构,以及各自的对应的内容。
小狼毫(Rime)配置生效原理_第7张图片
我们在 C 文件夹下创建一个wubi_pinyin.custom.yaml文档(可以复制一个现成的yaml文档来改,也可以创建一个txt文件,然后改后缀,需要注意编码格式为UTF-8),输入以下内容(注意:每行缩进两个空格,且短横线后有一空格)。
小狼毫(Rime)配置生效原理_第8张图片
保存 wubi_pinyin.custom.yaml 文档后运行重新部署,然后再打开 T 配置下的 wubi_pinyin.schema.yaml 观察,我们会看到如下图所示的engine内容,我们看到了engine的内容变成了我们在 C 配置下 wubi_pinyin.custom.yaml 文档内所定义的内容。
小狼毫(Rime)配置生效原理_第9张图片
关闭T 配置下的 wubi_pinyin.schema.yaml文档,现在我们修改 C 配置下 wubi_pinyin.custom.yaml 文档的内容如下。
小狼毫(Rime)配置生效原理_第10张图片
保存 wubi_pinyin.custom.yaml 文档后运行重新部署,我们应该可以发现 T 配置下的 wubi_pinyin.schema.yaml 文档的内容变成了如下所示内容。
小狼毫(Rime)配置生效原理_第11张图片
我们发现,T 配置下的 wubi_pinyin.schema.yaml 文档中的engine结构,我们只修改了其translators子结构中的内容,processors和segmentors的内容都没有改变。

再次关闭T 配置下的 wubi_pinyin.schema.yaml文档,现在我们修改 C 配置下 wubi_pinyin.custom.yaml 文档的内容如下。
小狼毫(Rime)配置生效原理_第12张图片
保存 wubi_pinyin.custom.yaml 文档后运行重新部署,我们应该可以发现 T 配置下的 wubi_pinyin.schema.yaml 文档的内容变成了如下所示内容。
小狼毫(Rime)配置生效原理_第13张图片
我们发现,T 配置下的 wubi_pinyin.schema.yaml 文档中的engine结构,我们在保持其当前内容的基础上,在其子节点translators下增加了新的内容(图中箭头所指)

至此,我们通过对比以上图中红框内的差异,我们得知,通过 C 配置来给 S 配置打补丁,生成 T 配置,我们有三种方法,分别如下:

方法1:
patch:
  engine:
    translators:
      - table_translator@custom_phrase
方法2:
patch:
  engine/translators:
    - table_translator@custom_phrase
方法3:
patch:
  engine/translators/+:
    - table_translator@custom_phrase

方法1,对于整个engine结构进行了替换。
方法2,对于指定的子结构engine/translators进行了替换。
方法3,对于指定的子结构engine/translators追加了新的内容。

如果你想整体定义一个结构体,可以使用方法 1 重新完整给出所关注结构的新的定义值。
如果我们只想变动某一个结构下指定子结构的值,可以使用方法 2 指定我们所关注的子结构并对其进行修改,这样避免了该结构的其它部分的内容受影响而变动,这是比较明智的操作。
如果我们希望在某一个结构当前状态下为其增加一些内容,可以使用方法 3 指定具体的结构节点,并指定其要增加的值即可。

需要说明的是,在 C 文件夹下 wubi_pinyin.custom.yaml 文档内的补丁内容,只有在 patch 这个结构下的内容,才会有补丁效果,所以大家会看到在输入法同名的custom.yaml文档中,总会存在一个 patch 的根结构。

default.custom.yaml 内的补丁生效方式,与上文所讲一致,此处不再展开。

致此,此文要讲的内容基本完成。如果有错误,还请评论区指出,不胜感激。

你可能感兴趣的:(小狼毫,Rime,yaml,c++)