RimeWithSchemata
方案定义
要让Rime实现某种具体输入法的功能,就需要一些数据来描述这种输入法以何种形式工作。即,定义该输入法的【个性】。
如「汉语拼音」、「注音」、「仓颉码」、「五笔字型」,这些方法可凭借Rime提供的通用设施、给定不同的工作参数来实际操作。
以本文介绍的规格写成一套套的配方,就是 Rime 输入方案。
Rime with Text Files
文本为王。Rime的配置文件、输入方案定义及词典文件,均为特定格式的文本文档。因此,一款够专业的文本编辑器,是设计Rime输入方案的必备工具。
Rime 中所有文本文档,均要求以UTF-8 编码,并建议使用UNIX 换行符(LF)。
鉴于一些文本编辑器会为UTF-8 编码的文件添加BOM 标记,为防止误将该字符混入文中, 莫要从文件的第一行开始正文,而请在该行行首以# 记号起一行注释,如:
# Rime default settings
# Rime schema: My First Cool Schema
# Rime dictionary: Lingua Latina
也可继续以注释行写下方案简介、码表来源、制作者、修订记录等信息,再切入正文。
Rime 中的数据文件分布及作用
除程序文件以外,Rime 还包括多种数据文件。这些数据文件存在于以下位置:
- 【中州韵】
/usr/share/rime-data/
- 【小狼毫】
"安裝目錄\data"
- 【鼠须管】
"/Library/Input Methods/Squirrel.app/Contents/SharedSupport/"
- 【中州韵】
~/.config/ibus/rime/
(0.9.1以下版本为~/.ibus/rime/
) - 【小狼毫】
%APPDATA%\Rime
- 【鼠须管】
~/Library/Rime/
共享资料夹包含预设输入方案的源文件。这些文件属于Rime所发行软件的一部份,在访问权限控制较严格的系统上对用户是只读的,因此谢绝软件版本更新以外的任何修改——一旦用户修改这里的文件,很可能影响后续的软件升级或在升级时丢失数据。
在「部署」操作时,将用到这里的输入方案源文件、并结合用户定制的内容来编译预设输入方案。
用户资料夹则包含为用户准备的内容,如:
- 〔全局设定〕
default.yaml
- 〔发行版设定〕
weasel.yaml
- 〔预设输入方案副本〕
<方案標識>.schema.yaml
- ※〔安装信息〕
installation.yaml
- ※〔用户状态信息〕
user.yaml
编译输入方案所产出的二进制文件:
- 〔Rime 棱镜〕
<方案标识>.prism.bin
- 〔Rime 固态词典〕
<词典名>.table.bin
- 〔Rime 反查词典〕
<词典名>.reverse.bin
记录用户写作习惯的文件:
- ※〔用户词典〕
<词典名>.userdb/
或<词典名>.userdb.kct
- ※〔用户词典快照〕
<詞典名>.userdb.txt
、<詞典名>.userdb.kct.snapshot
见于同步文件夹
以及用户自己设定的:
- ※〔用户对全局设定的定制信息〕
default.custom.yaml
- ※〔用户对预设输入方案的定制信息〕
<方案标识>.custom.yaml
- ※〔用户自制输入方案〕及配套的词典源文件
日志:
- 【中州韵】
/tmp/rime.ibus.*
- 【小狼毫】
%TEMP%\rime.weasel.*
- 【鼠须管】
$TMPDIR/rime.squirrel.*
- 各发行版的早期版本
用户资料夹/rime.log
注:以上标有※ 号的文件,包含用户资料,您在清理文件时要注意备份!
详解输入方案
方案定义
一套输入方案,通常包含「方案定义」和「词典」文件。
方案定义,命名为<方案标识>.schema.yaml
,是一份包含输入方案配置信息的YAML文档。
文档中需要有这样一组方案描述:
schema:
schema_id: luna_pinyin
name: 明月拼音
version: "0.9"
autor:
- 佛振 <chen.sst@gmail.com>
description: |
Rime 预设的拼音输入方案。
首先来为方案命名。schema/name
字段是显示在「方案选单」中的名称。
然后——重点是——要定一个在整个Rime 输入法中唯一的「方案标识」,即schema/schema_id
字段的内容。方案标识由消协字母、数字、下划线构成。仅在输入法内部使用,且会构成方案定义文件名的一部分,因此为了兼容不同的文件系统,不要用大写字母、汉字、空格和其他符号做方案标识。
方案如做升级,通过版本号(schema/version
)来区分相互兼容的新旧版本。
忽略一部分的关于版本的详细内容
schema/author
——列出作者和主要共享者,格式略
schema/author
——列出作者和主要共享者,格式略
schema/description
——对方案作简要介绍的多行文字。
除方案描述外,方案定义文件中还包含各种功能设定,控制着输入法引擎的工作方式。
输入法引擎与功能组件
按键消息–>后台「服务」–> 分配给对应的「会话」–> 由「方案选单」或「输入引擎」处理。。。
Rime 可以在不同会话里使用不同输入法方案。因为由「方案选单」。方案选单本身可相应一些按键。但由于他不会写字的缘故。更多时候要把按键传递给同一会话中的「输入引擎」继续处理。方案选单的贡献,就是给用户一个便捷的方案切换介面,再把用户挑中的输入方案加载到输入引擎。
再论输入引擎的工作流程:
加载输入方案、预备功能组件;各就位之后就进入处理按键消息、处理按键消息。。。的循环。
相应各种按键、产生各类结果的工作,由不同的功能组件分担。
好,看代码:
略
理解Processor
Processor,意思即“处理器”。输入引擎,作为整体来看,以按键消息为输入,输出包括三部分:
- 一是对按键消息的处理结果:操作系统要一个结果、这按键、轮入法接是不接?
- 二是暂存于输入法,尚未完成处理的内容,会展示在输入法候选窗中。
- 三是要「上屏」的文字,并不是每按一键都有输出。通常中文字都会伴随「确认」动作而上屏,有些按键则会直接导致符号上屏,而这些还要视具体场景而定。
理解Segmentors
Segment 是段落的意思,segmentor
意即分段器,将用户连续输入的文字、数字、符号等不同内容按照需要,识别不同格式的输入码,将输入码分成若干段分而治之。这通过数论代码段划分操作完成。略
理解Translators
顾名思义,Translator
完成由编码到文字的翻译。
- 一是翻译的对象是划分好的一个代码段。
- 二是某个
translator
组件往往只翻译具有特定标签的代码段。 - 三是翻译的结果可能有多条,每条结果成为一个展现给用户的候选项。
- 四是代码段可由几种
translator
分别翻译、翻译结果按一定规则合并成一列候选。 - 五是候选项所对应的编码未必是整个代码段。用拼音敲一个词组时,词组后面继续列出单字候选,即是此例。
双目如探针般进入内存查看,发现翻译的结果呈现这种形式:
input | tag | translations
------+--------+-------------------------------------
2012 | number | [ "2012" ], [ "二〇一二" ]
nian | abc | [ "年", "念", "唸",... ], [ "nian" ]
\ | punct | [ "、", "\" ]
输入串划分为多个代码段、每段代码又可具有多组翻译结果;取各代码段的首选结果连接起来,就是预备上屏的文字「2012年、
」。
略
理解Filters
Filter 即过滤器。上一步已经收集到各大代码段的翻译结果,当输入法需要在介面呈现一页候选项时,就从最末一个代码段的结果集中挑选、直至取够方案中设定的页最大候选数。
每从结果集选出一条字词、会经过一组filters
过滤。多个filter
串行工作,最终产出的结果进入候选序列。
filter
可以:
- 改装正在处理的候选项,修改某些属性值:简化字、火星文、菊花文有无有?过时了!有Rime,你对文字的想象力终于得救
- 消除当前候选项,比如检测到重复(由不同
translator
产生)的候选条目 - 插入新的候选项,比如根据已有条目插入关联的结果
- 修改已有的候选序列
码表与词典
词典是translator
的参考书。
他往往与同名输入方案配套使用,如拼音的词典以拼音码查字,仓颉的词典以仓颉码查字。但也可以由若干编码属于同一系统的输入方案共用,如各种双拼方案,都使用和拼音同样的词典,于是不仅复用了码表数据,也可共享用户以任一款此系列方案录入的自造词(仍以码表中的形式即全拼编码记录)。
Rime的词典文件,命名为<词典名>.dict.yaml
,包含一份码表及对应的规则说明。词典文件的前半部分为一份YAML文档:
# 注意這裏以 --- ... 分別標記出 YAML 文檔的起始與結束位置
# 在 ... 標記之後的部份就不會作 YAML 文檔來解讀
---
name: luna_pinyin
version: "0.9"
sort: by_weight
use_preset_vocabulary: true
...
解释:
name
:词典名,内部使用,命名原则同「方案标识」;可以与配套的输入方案标识一致,也可不同version
:管理词典的版本,规则同输入方案定义文件的版本号;sort
:词条初始排序方式,可选填by_weight
(按词频高低排序)或original
(保持原码表中的顺序);use_preset_vocabulary
:填 true 或 false。选择是否导入预设词汇表「八股文」
码表,定义了输入法中编码与文字的对应关系。
码表位于词典文件中YAML结束标记之后的部分。其格式为以制表符分割的值(TSV
),每行定义一条「文字-编码」的对应关系。
# 單字
你 ni
我 wo
的 de 99%
的 di 1%
地 de 10%
地 di 90%
目 mu
好 hao
# 詞組
你我
你的
我的
我的天
天地 tian di
好天
好好地
目的 mu di
目的地 mu di di
※注意:不要从网页复制以上代码到实作的词典文件!因为网页里制表符被转换成空格从而不符合Rime词典要求的格式。
码表部分,除了以上格式的编码行,还可以包含空行(不含任何字符)及注释行(行首为#符号)。
以制表符(Tab)分隔的第一个字段是所定义的文字,可以是单字或词组;
第二个字段是与文字对应的编码;若编码由多个「音节」组成,音节之间以空格分开;
可选地、第三个字段是设定该字词权重的频度值(非负整数),或相对于预设权值的百分比(浮点数%)。在拼音输入法总,往往多音字的若干种读音使用的场合不同,于是指定不同百分比来修正每个读音的使用频度。
词组如果满足以下条件,则可以省去编码字段:
- 词组中每个单字均有编码定义
- 词组中不包含多音字(例:你我),或多音字在该词组中读音的权值超过该多音字全部读音权值的5%(例:我的)
这种条件下,词组的编码可由单字编码的组合推导出来。
反之,则有必要给出词组的编码以消除自动注音的不确定性(例:天地)。
当含有多音字的词组缺少编码字段时,自动注音程序会利用权重百分比高于5%的读音进行组合、生成全部可能的注音,如:
「好好地」在编译时自动注音为「hao hao de
」、「hao hao di
」
编译输入方案
将写入的输入方案部署到Rime 输入法的过程,称为「编译」:
为查询效率,故输入工作时不直接加载文本格式的词典源文件,而要在编译过程中,为输入方案生成专为高速查询设计的「.bin」文件。
编译时程序做以下几件事:
- 将用户的定制内容合并到输入方案定义中,在用户资料夹生成
.schema.yaml
文档副本; - 依照输入方案中指定的词典;求得音节表(不同种编码的集合)、单字表;
- 对词典中未提供编码的词组自动注音,也包括「八股文」导入的词组;
- 建立按音节编码检索词条的索引,制作Rime 固定词典;
- 建立按词条检索编码的索引,制作Rime反查词典;
- 按照音节表和方案定义中指定的拼写运算规则,指定Rime 棱镜。
部署Rime
初次安装Rime 输入法,无有任何输入方案和用户设定。因此安装的最后一个步骤即是把发行版预设的输入方案和设定文件部署到Rime 为该用户创建的工作目录,至此Rime才能称为一部可以发送的输入引擎。
★〕重新布署的方法是:
- 【小狼毫】从开始菜单选择「重新部署」;或当开启托盘图标时,在托盘图标上右键选择「重新布署」;
- 【鼠须管】在系统语言文字选单中选择「重新布署」;
- 【中州韵】点击输入法状态栏(或
IBus
菜单)上的⟲ (Deploy) 按钮; - 早于
ibus-rime 0.9.2
的版本:删除用户资料夹的default.yaml
之后、执行ibus-daemon -drx
重载IBus
定制指南
Rime 输入方案,将Rime输入法的设定整理成完善的、可分发的形式。但并非一定要创作新的输入方案,才能改变Rime的行为。
当用户需要对Rime 中的各种设定做最小幅的调节,最直接,但不完全正确的做法是:编辑用户资料夹中的那些.ymal
文档。
这一方法有弊端:
- 当Rime 软件升级时,也会升级各种设定档、预设输入方案。用户编辑过的文档会被覆写为更高版本,所以调整也便丢失了。
- 即使在软件是升级后再手动回复经过编辑的文件,也会因设定当的其他部分未得到更新而失去本次升级新增和修复的功能。
因此,对于随Rime 发行的设定档及预设输入方案,推荐的定制方法是:
创建一个文件名的主体部分(「.」之前)要与定制的文件相同、次级扩展名(位于「.yaml」之前)写作.custom
的定制档,形如:
path:
"一级设定项/二级设定项/三级设定项":新的设定值
"另一个设定项":新的设定值
"再一个设定项":新的设定值
"含列表的设定项/@0":列表第一个元素的新的设定值
"含列表的设定项/@last":列表最后一个元素的新的设定值
"含列表的设定项/@before 0":在列表第一个元素之前插入新的设定值(不建议再补丁中使用)
"含列表的设定项/@after last":在列表最后一个元素之后插入新的设定值(不建议再补丁中使用)
"含列表的设定项/@enxt":再类表最后一个元素之后插入新的设定值(不建议再补丁中使用)
patch
定义了一组「补丁」,以源文件的设定为底本,写入新的设定项、或以新的设定值取代旧有的值。
例子:定制每页候选数
Rime 中,默认每页最多显示5个候选项,而允许的范围是1~9(个别Rime 发行版可支持10个候选)。
设定每页候选项个数的默认值为9,再用户目录建立文档default.custom.yaml
:
patch:
"menu/page_size": 9
使用Note pad ++
编译结果不成,遂使用Sublime Text
编辑可以。
重新部署即可生效。
**「注意」**如果 default.custom.yaml
里面已经有其它设定内容,只要以相同的缩进方式添加patch:
以下的部分,不可重复patch:
这一行。
若只需要设置单一输入方案的每页候选数设置为9,以「明月拼音」为例,建立文档luna_pinyin.custom.yaml
写入相同的内容,重新部署即可生效。
例子:定制标点符号
有的用户习惯以/
键入标点符号「、」。
仍以【明月拼音】为例,输入方案中有以下设定:
# luna_pinyin.schema.yaml
punctuator:
import_preset: default
解释
punctuator
是Rime 中负责转换标点符号的组件。该组件会从设定中读取符号映射表,而知道该做哪些转换。
因为和实际貌似有些不同。略
例子:定制简化字输出
如果只是需要Rime 输出简化字,敲**Ctrl + `**组合键,从菜单中选择「漢字→汉字」即可!
配置方法略
例子:默认英文输出
例子:定制方单选项
例子:定制缓冲方案选单的快捷键
例子:定制「小狼毫」字体字号
patch:
"style/font_face": "宋体" #字体名称,从记事本等系统字体对话框里能看到
"style/font_point": 14 # 字号,只认数字,不认「五号」、「小五」
例子:定制【小狼毫】配色方案
在特定程序里关闭中文输入
在指定的应用程序中,改变输入法的初始转换状态,如在
- 终端
- 代码编辑器
例如,要在gvim
里面关闭中文输入,可如此设定:
# exmaple weasel.custom.yaml
patch:
app_options/gvim.exe: # 程序名称全用小写字母
ascii_mode: true
输入习惯
使用Control 键切换中西文
方便地輸入含數字的西文用戶名
以方括號鍵換頁
同步用户资料
借助移动存储设备,或使用在线服务如OneDrive
,在多台电脑及不同系统之间同步用户词典和用户设定。
设定同步位置
默认的,词典快照备份到RIME用户文件夹\sync\UUID
这个地方。如果你网盘或U盘在不同机器/系统之间同步用户词典,则需要设定同步的目标文件夹。如 D:\Document\OneDrive\RimeSync
。
需要编辑用户文件夹下的installation.yaml
,添加:
sync_dir: 'D:\Document\OneDrive\RimeSync'
又如Mac 上添加:
sync_dir: '/Users/fred/Dropbox/RimeSync'
USB 存储同步:
sync_dir: '/Volumes/USBDRIVE/RimeSync'
默认地,每套Rime 会随机生成一个UUID
作为标识。不同 install ID 可区分来自不同机器/系统的用户词典。与安装在其它系统上的Rime 同步后,同步文件夹如下布局:
D:\Document\OneDrive\RimeSync\id-xxx\luna_pinyin.userdb.txt
D:\Document\OneDrive\RimeSync\id-xxx\terra_pinyin.userdb.txt
D:\Document\OneDrive\RimeSync\id-xxx\installation.yaml
D:\Document\OneDrive\RimeSync\id-xxx\default.custom.yaml
D:\Document\OneDrive\RimeSync\id-xxx\weasel.custom.yaml
D:\Document\OneDrive\RimeSync\id-yyy\terra_pinyin.userdb.txt
D:\Document\OneDrive\RimeSync\id-yyy\installation.yaml
D:\Document\OneDrive\RimeSync\id-yyy\default.custom.yaml
D:\Document\OneDrive\RimeSync\id-yyy\squirrel.custom.yaml
D:\Document\OneDrive\RimeSync\id-zzz\luna_pinyin.userdb.txt
D:\Document\OneDrive\RimeSync\id-zzz\installation.yaml
D:\Document\OneDrive\RimeSync\id-zzz\alternative.yaml
D:\Document\OneDrive\RimeSync\id-zzz\luna_pinyin.custom.yaml
同步时,依次将各自子文件夹中的词典快照合并到用户词典,最后合并后的用户词典生成一份新的快照文件。另外,还会把用户文件夹中非自动生成YAML文件及.txt
文件备份到同步文件夹中。
有些特别讲究命名的用户,不喜欢随机生成的UUID
,可编辑installation.yaml
,取一个有意义的ID。如:
installation_id: 'fred-win7-desktop'
又如:
installation_id: 'fred-macbook'
注意:因为Rime 要以这个ID 为名创建文件夹,因此ID 不得包含文件名中有非法的字符;建议不要用中文,只用小写字母、数字、横线或下划线。