当前位置: 首页 > 工具软件 > Rime > 使用案例 >

山东大学软件工程应用与实践——RIME输入法配置文件分析

郏扬
2023-12-01

2021SC@SDUSC

一.配置文件格式

  • .yaml文件是配置文件,是我们主要修改的一块.例如(default.yaml 是输入法配置文件夹, luna_pinyin.schema.yaml,是luna(明月)输入方案的配置文件)
  • .custom.yaml是用户用来自定义配置的内容.
  • .bin文件是rime输入法自动生成的, 不需要去动.
  • .table.bin 是生成的词库文件(在重新部属的时候会自动生成需要导入词库的.table.bin文件.)

二.配置原理

在输入法重新部属的时候, 会所需要的设置文件, 词库文件等。在生成default.yaml的时候, 会去同名的default.custom.yaml中读取设置, 如果与默认设置冲突, 则以用户设置为准, 然后再生成改动过的default.yaml文件。
这和Python中的类的继承顺序是一样的. 会先调用子类,冲突项目使用子类, 如未设定 则读取父类相关设定。

三.配置简介

配置分为三个方面。

  • 输入法方面: 根据default.yaml 创建default.custom.yaml
  • 输入方案方面: 根据luna_pinyin.schema.yaml 创建luna_pinyin.custom.yaml
  • 词库方面: 手动创建 xxx.dict.yaml 文件.

##这些个文件是最重要的, 保存着你对输入法的自己的定制.。只要保存好自己的设置文件和词库文件, 配置里面的文件都删掉也都无所谓, 重新布署之后又会生成默认文件。只要在rime重新布署的时候发现用户的配置文件, 就会改写默认配置。

关于配置文件的格式语法:
配置文件的语法遵照yaml语言。
default.custom.yaml和luna_pinyin.custom.yaml这两个文件的书写格式和对应文件default.yaml, luna_pinyin.yaml几乎是一样的。不过需要在文件头增加patch: 然后之中写入的配置,较原文件增加一个单位的缩进,对应于patch:.(yaml中缩进为两个空格). # 表示注释, 可以出现行中任意位置, 之后的内容不会被解释器解释。

1.Rime 的各种配置,均是由 .yaml 文件所定义。
2.yaml 是一种标记语言。.yaml 文件实际上是文本文档。可使用记事本、或 Emeditor 等进行编辑。
3.对 Rime 进行自定义,是通过对 .custom.yaml 文件修改达成。不同的 .custom.yaml 文件,控制不同的功能实现。 .custom.yaml 实际上是相当于对 .yaml 文件打补丁,在重新部署后,会将 .custom.yaml 中的内容写入 .yaml 文件中,完成自定。
例一: weasel.yaml 是常规设置,主要控制托盘图标、候选词横竖排列、界面配色等等功能。那么,我们需要定制界面配色,只需在 weasel.custom.yaml 中修改,重新部署后就可实现。
例二: default.yaml 是默认设置,主要控制快捷键、按键上屏等等。同样,作修改就编辑 default.custom.yaml 文件即可。
例三:以上是全局设置,亦即不论使用何种输入方案,均起作用。 double_pinyin_flypy.custom.yaml 这种则是输入法方案设置。主要实现特殊标点符号、词库等功能。是针对特定输入方案的配置。

在“部署”操作时,将用到这里的输入方案源文件、并结合用户定制的内容来编译预设输入方案。

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

〔全局设定〕 default.yaml

〔发行版设定〕 weasel.yaml

〔预设输入方案副本〕 <方案标识>.schema.yaml

※〔安装信息〕 installation.yaml

※〔用户状态信息〕 user.yaml

五.输入法引擎与功能组件

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           # ※ 过滤重复的候选字,有可能来自繁简转换

六.方案定义

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

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

文档中需要有这样一组方案描述:

#以下代码片段节选自 luna_pinyin.schema.yaml

schema:
  schema_id: luna_pinyin
  name: 朙月拼音
  version: "0.9"
  author:
    - 佛振 <chen.sst@gmail.com>
  description: |
    Rime 预设的拼音输入方案。

首先来为方案命名。schema/name 字段是显示在〔方案选单〕中的名称。

然后——重点是——要定一个在整个 Rime 输入法中唯一的“方案标识”,即 schema/schema_id 字段的内容。 方案标识由小写字母、数字、下划线构成。 仅于输入法内部使用,且会构成方案定义文件名的一部分,因此为了兼容不同的文件系统,不要用大写字母、汉字、空格和其他符号做方案标识。 一例:这款名为【明月拼音】的输入方案,方案标识为“luna_pinyin”。

方案如做升级,通过版本号(schema/version)来区分相互兼容的新旧版本。

版本号——以“.”分隔的整数(或文字)构成的字符串。

如下都是版本号常见的形式:

"1"      # 最好加引号表明是字符串!
"1.0"    # 最好加引号表明是字符串!
"0.9.8"
"0.9.8.custom.86427531"  # 这种形式是经过用户自定义的版本;自动生成

然而,若对方案的升级会导致原有的用户输入习惯无法在新的方案中继续使用,则需要换个新的方案标识。

比如【仓颉五代】之于【仓颉三代】、【五笔 98】之于【五笔 86】,其实已是互不兼容的输入法。

schema/author ——列出作者和主要贡献者,格式为文字列表:

schema:
  author:
    - 作者甲 <alpha@rime.org>
    - 作者乙 <beta@rime.org>
    - 作者丙

schema/description ——对方案作简要介绍的多行文字。

以上 schema/schema_id、schema/version 字段用于在程序中识别输入方案, 而 schema/name、schema/author、schema/description 则主要是展示给用户的信息。

注:除示例代码中引用的组件外,尚有

- fluid_editor      # ※ 句式编辑器,用于以空格断词、回车上屏的【注音】、【语句流】等输入方案,替换 express_editor,也可以写作 fluency_editor
- chord_composer    # ※ 和弦作曲家或曰并击处理器,用于【宫保拼音】等多键并击的输入方案
- table_translator  # ※ 码表翻译器,用于仓颉、五笔等基于码表的输入方案,替换 script_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 输入法的过程,称爲“编译”:

爲查询效率故,输入法工作时不直接加载文本格式的词典源文件,而要在编译过程中,爲输入方案生成专爲高速查询设计的“.bin”文件。

编译时程序做以下几件事:

  • 将用户的定制内容合併到输入方案定义中,在用户资料夹生成 .schema.yaml 文档副本;
  • 依照输入方案中指定的词典:求得音节表(不同种编码的集合)、单字表;
  • 对词典中未提供编码的词组自动注音,也包括从【八股文】导入的词组;
  • 建立按音节编码检索词条的索引,制作 Rime 固态词典;
  • 建立按词条检索编码的索引,制作 Rime 反查词典;
  • 依照音节表和方案定义中指定的拼写运算规则,制作 Rime 棱镜。

九.输入法配置

1.配置小鹤双拼方案
将如下代码,复制黏贴进入 double_pinyin_flypy.custom.yaml 文件。

patch:

# 載入朙月拼音擴充詞庫
"translator/dictionary": luna_pinyin.extended

# 输入双拼码的时候不转化为全拼码
translator/preedit_format: {}

#载入custom_phrase自定义短语
engine/translators:

   - punct_translator
   - reverse_lookup_translator
   - script_translator
   - table_translator@custom_phrase #表示调用 custom_phrase段编码
   - table_translator

custom_phrase:
 dictionary: ""
 user_dict: custom_phrase
 db_class: stabledb
 enable_completion: false
 enable_sentence: false
 initial_quality: 1

#  符号快速输入和部分符号的快速上屏
punctuator:
 import_preset: symbols
 half_shape:
#      "#": "#"
   '`': ["·","`"]
#      "~": "~"
#      "@": "@"
#      "=": "="
#      "!": "!"
#      "/": ["/", "÷"]
   '\': "、"
#      "'": {pair: ["「", "」"]}
#      "[": ["【", "["]
#      "]": ["】", "]"]
#      "$": ["¥", "$", "€", "£", "¢", "¤"]
#      "<": ["《", "〈", "«", "<"]
#      ">": ["》", "〉", "»", ">"]

配置扩展词库
打开 luna_pinyin.extended.dict.yaml 文件。找到如下代码段。

---
name: luna_pinyin.extended
version: "2014.10.28"
sort: by_weight
use_preset_vocabulary: true
#此處爲明月拼音擴充詞庫(基本)默認鏈接載入的詞庫,有朙月拼音官方詞庫、明月拼音擴充詞庫(漢語大詞典)、明月拼音擴充詞庫(詩詞)、明月拼音擴充詞庫(含西文的詞彙)。如果不需要加載某个詞庫請將其用「#」註釋掉。
#雙拼不支持 luna_pinyin.cn_en 詞庫,請用戶手動禁用。
import_tables:

- luna_pinyin

#- luna_pinyin.cn_en

- luna_pinyin.computer

#- luna_pinyin.emoji

- luna_pinyin.hanyu

#- luna_pinyin.kaomoji

- luna_pinyin.movie
- luna_pinyin.music
- luna_pinyin.name
- luna_pinyin.poetry
- luna_pinyin.sgmain
- luna_pinyin.i

#

- f_myphrases
- f_mysecretphrases

...

双拼用户需将 luna_pinyin.cn_en 禁用。禁用的方式很简单,在相应代码行前加上 # 将其注释掉即可

配置自定义短语
在文件夹中,新建文本文档,更名为: Custom_phrase.txt。复制如下代码段到这个文档。

# Rime table
# coding: utf-8
#@/db_name custom_phrase.txt
#@/db_type tabledb
#
# 用於【朙月拼音】系列輸入方案
# 【小狼毫】0.9.21 以上
#
# 請將該文件以UTF-8編碼保存爲
# Rime用戶文件夾/custom_phrase.txt
#
# 碼表各字段以製表符(Tab)分隔
# 順序爲:文字、編碼、權重(決定重碼的次序、可選)
#
# 雖然文本碼表編輯較爲方便,但不適合導入大量條目
#
# no comment
xxx@gmail.com  gmail   1

以第一条 gmail 为例,根据文字、編碼、權重的先后顺序,按照每行一条的格式,输入你的自定义短语。注意,各个字段之间以制表符(tab)分隔,不是空格。

最后,在开始菜单【小狼毫】重新部署即可。

 类似资料: