2024-05-19    2024-06-25    5246 字  11 分钟

这是第几次安装 Rime 了?不晓得喽,只知道这种养成系的输入法,确实是很有魔力……

官网 RIME | 中州韻輸入法引擎

RIME/中州韵输入法引擎,是一个跨平台的输入法算法框架。基于这一框架,Rime 开发者与其他开源社区的参与者在 Windows、macOS、Linux、Android 等平台上创造了不同的输入法前端实现。

作者的序 Introduction · rime/home Wiki

写在前面的

这个章节主要记录一下个人的 Rime 处理方法,可以略过。如开头说的那样,我反复卸载安装 Rime 好多次了,有点当初折腾 Emacs 那味儿了……

Windows 平台上 Weasel 小狼毫的版本 - Releases · rime/weasel,目前最新版本为 ⬇️ 0.16.02024-05-14 更新)。

使用 rime/plum: 東風破 /plum/ 进行包管理。

1
2
3
4
5
cd C:\Users\jack\local
git clone --depth 1 https://github.com/rime/plum.git
cd plum
#bash rime-install :preset
bash rime-install :jk

为什么是 bash rime-install :jk ? 我们在当前目前 plum/ 下创建了个新的预设文件 jk-packages.conf ,用来安装对应的五笔输入法方案,其内容如下:

#!/usr/bin/env bash

package_list+=(
    emoji
    pinyin-simp
    wubi
)

执行上述命令后,会在「用户文件夹」(C:\Users\jack\AppData\Roaming\Rime)生成相应的配置资料。

在「输入法设定」中,选择 五笔.拼音 方案,或者也可以直接修改 default.cutom.yaml 中的 schema_list 项,添加 {schema: wubi_pinyin} 即可。这里为了方便定制及后期更新,我们创建一个与输入方案对应的配置文件 wubi_pinyin.custom.yaml ,其内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
patch:
  switches:
    - name: ascii_mode
      reset: 1
      states: [ 中文, 西文 ]
  menu/page_size: 5
  style:
    font_face: LXGW WenKai GB Screen R
    font_point: 14 
    horizontal: false 
  key_binder:
    bindings:
      #- { when: composing, accept: Return, send: Escape }
      - { when: has_menu, accept: semicolon, send: 2 }
      - { when: has_menu, accept: apostrophe, send: 3 }

使用 Rime 的最大动机便在于其可以很方便地在多台设备之间同步词库及对应的词频。这里我们使用坚果云进行同步(免费版月上传 1G,下载 3G),足够使用。当然,你也可以选择其他的云服务,比如华为云、OneDrive 等。

我们接下来修改一下用户文件夹下的 installation.yaml ,如下:

1
2
3
4
5
6
7
8
distribution_code_name: Weasel
distribution_name: '小狼毫'
distribution_version: 0.16.0
install_time: 'Mon May 20 09:34:57 2024'
#installation_id: "8e1661d0-fd7e-4c9f-aa75-83611cf211dd"
rime_version: 1.11.2
installation_id: 'jk-wubi'
sync_dir: 'C:\Users\jack\Nutstore\1\我的坚果云\RimeSync'

其中,关于 installation_id ,其默认值是根据当前设备生成的一串随机码,不同设备不一样,这里我们统一为 jk-wubisync_dir 便是设置的文件同步位置,默认是在用户文件夹中,这里我们把它设置为坚果云同步文件夹的根目录中。

需要注意的是,Rime 并没有默认的自动同步设置,我们需要手动触发「用户资料同步」。它有对应在快捷方式,每天下班时点一下即可。

我试图建立一个 Windows 定时任务,但是上述快捷方式最终定位到的执行程序是 WeaselDeployer.exe ,直接执行它打开的是「输入法设定」…… 目前还没有查询到该执行程序是否有对应的参数,允许触发「用户资料同步」。

关于第三方 Rime 方案 ,有 薄荷输入法 极点五笔 ,它们都扩展了一些词库。我目前只使用内置的五笔.拼音混输方案,因为以 Rime 的词频和记忆算法,根本不需要什么额外的词库,用上几天,经常输入的字库啥啥都有了~

PS:讲真,折腾输入法这种玩意儿,挺浪费时间的。如果不是站在养成系的角度上,作为一个长期投资来看待,真的是没有必要。之前使用微软五笔,体验也可以,缺点在于词频和词库的使用无法形成长期效益,换台设备就得从头来过,这让人很不爽。后面使用 冰凌五笔,设置简单便捷,备份还原也很方便,内置的几个皮肤也很错,但是和 Rime 比起来它的词频调整略微有些不那么智能。

怎么说呢?想折腾就折腾吧,想折腾不折腾就会内耗,反正折腾累了就不折腾了。


说明书

说明书 UserGuide · rime/home Wiki

专题:
- (初阶)定制指南
- (中阶)输入方案设计书
- (高阶)程序开发

第三方文档
- 鼠鬚管試玩心得/lionhoho
- 致第一次安裝 RIME 的你/半月湾C
- 「鼠须管」配置方案分享、 「鼠须管」的调教笔记/scomper
- 鼠须管输入法 傻瓜版配置 - 基于 rime_pro 增强包/changsj

下载与安装 - Windows 平台 Weasel 0.16.0 下载

使用方案选择 - 从 Rime 输入方案库获取输入方案

输入法设定 - 参阅 定制指南

用户词典管理

  • 备份及合并词典快照
  • 导出及导入文本码表
  • 导入其他来源的码表

同步用户资料:借助移动存储设备,或在线存储服务如 Dropbox,在多台电脑及不同系统之间同步用户词典和用户设定。

默认地,词典快照备份到 RIME 用户文件夹 \sync\UUID 这个地方。如果你要用 Dropbox 或 U 盘在不同机器/系统之间同步用户词典,则需要设定同步的目标文件夹,如 D:\Dropbox\RimeSync 。

直接编辑用户文件夹下的 installation.yaml ,添加:

sync_dir: 'D:\Dropbox\RimeSync'

……

默认地,每套 Rime 会随机生成一个 UUID 作为标识。不同 installation ID 可区分来自不同机器/系统的用户词典。

有些特别讲究命名的用家,不喜随机生成的 UUID,可编辑 installation.yaml ,取一个有意义的 ID,如:

installation_id: 'fred-win7-desktop'

必知必会

定制指南 CustomizationGuide · rime/home Wiki

建议您在定制 Rime 输入法之前了解 Rime 输入方案的概念、Rime 中的数据文件分布及作用等基础知识 - 必知必会

– 必知必会 –

 Rime 的配置文件、输入方案定义及词典文件,均为特定格式的文本文档。

Rime 输入法中,多用扩展名为「 .yaml 」的文本文档,这是以一种可读性高的数据描述语言—— YAML 写成。

Rime 中的数据文件分布及作用

除程序文件以外,Rime 还包括多种数据文件。这些数据文件存在于以下位置:

共享资料夹包含预设输入方案的源文件,它是只读的。

用户资料夹 则包含为用户准备的内容,如:

  • 全局设定 default.yaml
  • 发行版设定 weasel.yaml
  • 预设输入方案副本 xyz.schema.yaml
  • 〔安裝信息〕 installation.yaml
  • 〔用戶狀態信息〕 user.yaml

记录用户习惯的文件:

  • 〔用户词典〕 <詞典名>.userdb/ 或 <詞典名>.userdb.kct
  • 〔用户词典快照〕 <詞典名>.userdb.txt 、 <詞典名>.userdb.kct.snapshot 见于同步文件夹

用户自己设定的文件:

  • 〔用户对全局设定的定制信息〕 default.custom.yaml
  • 〔用户对预设输入方案的定制信息〕 <方案標識>.custom.yaml

💡 带 〔 〕 的文件,包含用户资料,您在清理文件时要注意备份!

详解输入方案

一套输入方案,通常包含「方案定义」和「词典」文件。

方案定义,命名为 <方案標識>.schema.yaml ,是一份包含输入方案配置信息的 YAML 文档。

# 以下代碼片段節選自 luna_pinyin.schema.yaml

schema:
  schema_id: luna_pinyin           # 方案标识 - 必须唯一
  name: 朙月拼音                    # 显示在方案选单中的名称
  version: "0.9.2"                 # 版本号
  author:                          # 作者、主要贡献者
    - 佛振 <chen.sst@gmail.com>
  description: |                   # 方案简介
    Rime 預設的拼音輸入方案。

输入法引擎与功能组件

论 Rime 输入法的工作流程:

按键消息→后台「服务」→分配给对应的「会话」→由「方案选单」或「输入引擎」处理……

Rime 可以在不同会话里使用不同输入方案。因为有「方案选单」。方案选单本身可响应一些按键。但由于它不会写字的缘故,更多时候要把按键递给同一会话中的「输入引擎」继续处理。方案选单的贡献,就是给用户一个便捷的方案切换介面,再把用户挑中的输入方案加载到输入引擎。

再论输入引擎的工作流程:

加载输入方案、预备功能组件;各就位之后就进入处理按键消息、处理按键消息……的循环。

响应各种按键、产生各类结果的工作,由不同的功能组件分担。

# luna_pinyin.schema.yaml
# ...

engine:                    # 输入法引擎设定,即挂接组件的“处方”
  processors:              # 一、这批组件处理各类按键消息
    - ascii_composer       # ※ 处理西文模式及中西文切换
    - recognizer           # ※ 与 matcher 搭配,处理符合特定规则的输入码,如网址、反查等
    - key_binder           # ※ 特定条件下将按键绑定到其他按键,如重定义逗号、句号为候选翻页键
    - speller              # ※ 拼写处理器,接受字符按键,编辑输入码
    - punctuator           # ※ 句读处理器,将单个字符按键直接映射为文字符号
    - selector             # ※ 选字处理器选字处理器,处理数字选字键、上、下候选定位、换页键
    - navigator            # ※ 处理输入栏内的光标移动键
    - express_editor       # ※ 编辑器,处理空格、回车上屏、回退键等
  segmentors:              # 二、这批组件识别不同内容类型,将输入码分段
    - ascii_segmentor      # ※ 标识西文段落
    - matcher              # ※ 标识符合特定规则的段落,如网址、反查等
    - abc_segmentor        # ※ 标识常规的文字段落
    - punct_segmentor      # ※ 标识句读段落
    - fallback_segmentor   # ※ 标识其他未标识段落
  translators:             # 三、这批组件翻译特定类型的编码段为一组候选文字
    - echo_translator      # ※ 没有其他候选字时,回显输入码
    - punct_translator     # ※ 转换标点符号
    - script_translator    # ※ 脚本翻译器,用于拼音等基于音节表的输入方案
    - reverse_lookup_translator  # ※ 反查翻译器,用另一种编码方案查码
  filters:                 # 四、这批组件过滤翻译的结果
    - simplifier           # ※ 繁简转换
    - uniquifier           # ※ 过滤重复的候选字,有可能来自繁简转换

输入引擎把完成具体功能的逻辑拆分为可装卸、组合的部件。 「加载」输入方案,即按该处方挂接所需的功能组件、令这些组件从输入方案定义中加载各自的设定、准备各司其职。而他们接下来要完成的作业,由引擎收到的一份按键消息引发。

第一类功能组件 processor s,就是比较笼统地、起着「处理」按键消息的作用。

processor 最常见的处理,便是将按键所产生的字符记入上下文中的「输入码」序列。当「输入码」发生变更时,下一组组件 segmentor s 开始一轮新的作业。

Segment 是段落的意思,segmentor 意即分段器,将用户连续输入的文字、数字、符号等不同内容按照需要,识别不同格式的输入码,将输入码分成若干段分而治之 – 打上「类型标签」。

下一个阶段中, translator s 会把特定类型的编码段翻译为文字。翻译的结果可能有多条,每条结果成为一个展现给用户的候选项。

input | tag    | translations
------+--------+-------------------------------------
2012  | number | [ "2012" ], [ "二〇一二" ]
nian  | abc    | [ "年", "念", "唸",... ], [ "nian" ]
\     | punct  | [ "、", "\" ]

Filter 即过滤器。上一步已经收集到各个代码段的翻译结果,当输入法需要在介面呈现一页候选项时,就从最末一个代码段的结果集中挑选、直至取够方案中设定的页最大候选数。

每从结果集选出一条字词、会经过一组 filter s 过滤。多个 filter 串行工作,最终产出的结果进入候选序列。

码表与词典

词典是 translator 的参考书。

它往往与同名输入方案配套使用,如拼音的词典以拼音码查字,仓颉的词典以仓颉码查字。但也可以由若干编码属于同一系统的输入方案共用,如各种双拼方案,都使用和拼音同样的词典,于是不仅复用了码表数据,也可共享用户以任一款此系列方案录入的自造词(仍以码表中的形式即全拼编码记录)。

Rime 的词典文件,命名为 <詞典名>.dict.yaml ,包含一份码表及对应的规则说明。词典文件的前半部份为一份 YAML 文档:

# 注意这里以 --- ... 分别标记出 YAML 文档的起始与结束位置
# 在 ... 标记之后的部份就不会作 YAML 文档来解读

---
name: luna_pinyin             # 词典名,通常与配套的输入方案标识一致
version: "0.9"                # 词典版本号
sort: by_weight               # 词条初始排序方式 - by_weight(按词频排序) 或 original
use_preset_vocabulary: true   # 是否导入预设词汇表八股文
...

码表,定义了输入法中编码与文字的对应关系。

码表位于词典文件中 YAML 结束标记之后的部份。其格式为以制表符分隔的值(TSV),每行定义一条「文字-编码」的对应关系:

# 单字
你	ni
我	wo
的	de	99%
的	di	1%
地	de	10%
地	di	90%
目	mu
好	hao

# 词组
你我
你的
我的
我的天
天地	tian di
好天
好好地
目的	mu di
目的地	mu di di

码表部份,除了以上格式的编码行,还可以包含空行(不含任何字符)及注释行(行首为 # 符号)。

以制表符(Tab)分隔的第一个字段是所定义的文字,可以是单字或词组;第二个字段是与文字对应的编码;若该编码由多个「音节」组成,音节之间以空格分开;可选地、第三个字段是设定该字词权重的频度值(非负整数),或相对于预设权值的百分比(浮点数%)。

设定项速查手册

雪斋的文档 全面而详细解释了输入方案及词典中各设定项的含义及用法。

编译输入方案

将写好的输入方案布署到 Rime 输入法的过程,称为「编译」。

部署 Rime

初次安装 Rime 输入法,无有任何输入方案和用户设定。因此安装的最后一个步骤即是把发行版预设的输入方案和设定文件布署到 Rime 为该用户创建的工作目录,至此 Rime 才成为一部可以发动的输入引擎。

此后无论是修改已有方案的设定,或是添加了新的输入方案,都需要「重新布署」成功后方可使用户的新设定作用于 Rime 输入法。


定制指南

CustomizationGuide · rime/home Wiki

对于随 Rime 发行的设定档及预设输入方案,推荐的定制方法是:创建一个文件名的主体部份(「.」之前)与要定制的文件相同、次级扩展名(「.yaml」之前)为 .custom 的定制文档。

patch:
  "一级设定项/二级设定项/三级设定项": 新的设定值
  "另一个设定项": 新的设定值
  "再一个设定项": 新的设定值
  "含列表的设定项/@n": 列表第n个元素新的设定值,从0开始计数
  "含列表的设定项/@last": 列表最后一个元素新的设定值
  "含列表的设定项/@before 0": 在列表第一个元素之前插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/@after last": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/@next": 在列表最后一个元素之后插入新的设定值(不建议在补靪中使用)
  "含列表的设定项/+": 与列表合并的设定值(必须为列表)
  "含字典的设定项/+": 与字典合并的设定值(必须为字典,注意YAML字典的无序性)

就是这样: patch 定义了一组「补丁」,以源文件中的设定为基础,写入新的设定项、或以新的设定值取代现有设定项的值。


其他参考