# Rime 配置文件完整详解

## 一、总览

| 文件                       | 全称                | 作用                                                         | 类比                                   |
| :------------------------- | :------------------ | :----------------------------------------------------------- | :------------------------------------- |
| **`{方案名}.schema.yaml`** | Schema 配置文件     | 定义输入方案的**完整逻辑**：按键处理、编码规则、翻译器、过滤器、快捷键等 | 输入法的"**引擎总成**"或"**操作系统**" |
| **`{方案名}.dict.yaml`**   | Dictionary 配置文件 | 定义**码表数据**：字词与编码的对应关系、词频、自动造词规则等 | 输入法的"**数据库**"                   |

> **关系**：`schema.yaml` 调用 `dict.yaml`，两者共同构成一个完整的 Rime 输入方案。

## 二、schema.yaml 完整详解

### 2.1 文件头信息

yaml

```
# Rime schema
# encoding: utf-8

schema:
  name: "蒼頡檢字法"              # 方案显示名称，出现在方案选单中
  schema_id: cangjie6            # 方案内部ID，代码引用时使用
  author:                        # 作者列表
    - "發明人 朱邦復先生、沈紅蓮女士"
    - "碼表整理 雪齋、惜緣"
  description: |                 # 方案描述，可多行
    第六代倉頡輸入法
    碼表由雪齋、惜緣和crazy4u整理
    支援反查、簡化字轉換等功能
  version: "0.19"                # 版本号，更新时递增
  dependencies:                  # 依赖的其他方案（用于反查等）
    - luna_pinyin                # 依赖明月拼音
    - jyutping                   # 依赖粤拼
```



### 2.2 开关（switches）

开关定义用户可以**随时切换**的功能选项。

#### 2.2.1 普通开关（二态）

yaml

```
switches:
  - name: ascii_mode             # 开关内部名称
    reset: 0                     # 默认值：0=中文，1=英文
    states: ["中文", "西文"]      # 状态显示标签

  - name: full_shape             # 全角/半角
    states: ["半角", "全角"]

  - name: extended_charset       # 字符集范围
    states: ["通用", "增廣"]

  - name: simplification         # 简繁转换
    states: ["漢字", "汉字"]

  - name: ascii_punct            # 中/西文标点
    states: ["句讀", "符號"]
```



**使用方式**：

- 用户可通过快捷键（在 `key_binder` 中配置）切换
- 切换时，状态栏会显示对应的 `states` 文字

#### 2.2.2 多选开关（多态互斥）

yaml

```
switches:
  - options: [ zh_trad, zh_cn, zh_mars ]   # 三个互斥选项
    states:                                # 显示标签
      - 字型 → 漢字
      - 字型 → 汉字
      - 字型 → 䕼茡
    reset: 0                               # 默认选中第0个
```



**多选开关的特点**：

- 同一时间**只能选中一个**选项
- 选中一个时，其他选项自动关闭
- 在 `key_binder` 中用 `set_option:` 和 `unset_option:` 控制
- `options` 中的名称必须与对应 `simplifier` 的 `option_name` 一致

### 2.3 引擎（engine）

引擎是 schema 的**核心**，定义了输入法处理按键和生成候选的完整流程。

yaml

```
engine:
  processors:      # ① 按键处理器
  segmentors:      # ② 分段器
  translators:     # ③ 翻译器
  filters:         # ④ 过滤器
```



#### 2.3.1 processors（按键处理器）

处理用户按下的每个按键事件。

| 处理器           | 作用                                     |
| :--------------- | :--------------------------------------- |
| `ascii_composer` | 处理中英文模式切换                       |
| `recognizer`     | 识别特殊输入模式（如反查前缀、URL等）    |
| `key_binder`     | 快捷键绑定（翻页、选字、切换开关等）     |
| `speller`        | **核心**：拼写处理，将按键转换为编码     |
| `punctuator`     | 标点符号处理                             |
| `selector`       | 候选字选择处理（数字键选字、上下翻页）   |
| `navigator`      | 输入栏光标移动                           |
| `express_editor` | 编辑器：空格上屏、回车上屏、退格         |
| `fluid_editor`   | 句式编辑器（用于注音等以空格断词的方案） |
| `chord_composer` | 并击处理器（用于宫保拼音等多键并击方案） |
| `lua_processor`  | Lua自定义按键处理                        |

**处理顺序**：按键从第一个 processor 依次传递，直到某个 processor 处理了该按键。

#### 2.3.2 segmentors（分段器）

将输入串切分成有意义的段落，并为每个段落打上 **tag（标签）**。

| 分段器               | 作用                                                         |
| :------------------- | :----------------------------------------------------------- |
| `ascii_segmentor`    | 标记西文（ASCII）段落                                        |
| `matcher`            | 配合 recognizer，标记符合特定模式的段落（URL、邮箱、反查等） |
| `abc_segmentor`      | 标记常规文字段落，打上 `abc` tag                             |
| `punct_segmentor`    | 标记标点符号段落，打上 `punct` tag                           |
| `fallback_segmentor` | 标记其他未识别段落                                           |
| `affix_segmentor`    | 自定义前缀/后缀段落，可指定 tag                              |
| `lua_segmentor`      | Lua自定义分段                                                |

**tag 的作用**：后续的 translator 和 filter 可以根据 tag 决定处理哪些段落。

#### 2.3.3 translators（翻译器）

将编码段落翻译成候选词列表。

| 翻译器                      | 用途                 | 适用方案         |
| :-------------------------- | :------------------- | :--------------- |
| `echo_translator`           | 无候选时回显输入码   | 所有方案         |
| `punct_translator`          | 标点符号转换         | 所有方案         |
| `table_translator`          | 基于固定码表的翻译   | 仓颉、五笔等形码 |
| `script_translator`         | 基于音节表的动态翻译 | 拼音、粤拼等音码 |
| `reverse_lookup_translator` | 反查翻译（旧方式）   | 需要反查的方案   |
| `history_translator`        | 显示输入历史候选     | 所有方案         |
| `lua_translator`            | Lua自定义翻译        | 所有方案         |

**多实例支持**：同一个类型可以加载多个实例，用 `@` 加实例名区分：

yaml

```
translators:
  - table_translator
  - script_translator@pinyin
  - script_translator@jyutping
  - lua_translator@get_date
```



#### 2.3.4 filters（过滤器）

对翻译器生成的候选列表进行**后处理**。

| 过滤器                  | 作用                   |
| :---------------------- | :--------------------- |
| `uniquifier`            | 去除重复候选           |
| `cjk_minifier`          | 按字符集过滤候选       |
| `single_char_filter`    | 只显示单字（屏蔽词组） |
| `simplifier`            | 简繁转换               |
| `reverse_lookup_filter` | 反查过滤（新方式）     |
| `lua_filter`            | Lua自定义过滤          |

### 2.4 细项配置

#### 2.4.1 speller（拼写规则）

yaml

```
speller:
  alphabet: "zyxwvutsrqponmlkjihgfedcba"   # 允许的输入按键
  initials: "bcdfghjklmnpqrstvwxyz"        # 仅作声母的按键
  finals: "aeiou"                          # 仅作韵母的按键
  delimiter: " '"                          # 音节分隔符
  max_code_length: 5                       # 最大码长，超出自动上屏
  auto_select: false                       # 是否自动上屏
  auto_select_pattern: "^[a-z]{5}$"        # 自动上屏的正则规则
  use_space: false                         # 是否允许空格作为输入码
  
  algebra:                                 # 拼写运算规则
    - erase/^xx$/                          # 删除特定的无效编码
    - abbrev/^([a-z]).+$/$1/               # 简拼：取首字母
    - derive/^([nl])ve$/$1ue/              # 推导：nve→nue, lve→lue
    - derive/^([jqxy])u/$1v/               # 推导：ju→jv (对应jü)
    - derive/un$/uen/                      # 推导：un→uen
    - derive/ui$/uei/                      # 推导：ui→uei
    - derive/([aeiou])ng$/$1gn/            # 容错：ang→agn
    - fuzz/^([zcs])h/$1/                   # 模糊音：zh→z（不用于单字）
    - xlit/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/  # 大小写变换
```



**algebra 规则的执行顺序**：从上到下依次执行，后面的规则基于前面的结果。

**规则类型**：

| 类型     | 作用         | 是否保留原形       |
| :------- | :----------- | :----------------- |
| `xform`  | 改写         | 否                 |
| `derive` | 衍生         | 是                 |
| `abbrev` | 简拼         | 是（但优先级较低） |
| `fuzz`   | 模糊音       | 是（仅用于组词）   |
| `xlit`   | 一一对应变换 | 是                 |
| `erase`  | 删除匹配内容 | 否                 |

#### 2.4.2 translator（翻译器配置）

**主翻译器**（引擎列表中无 `@` 后缀的那个）：

yaml

```
translator:
  dictionary: cangjie6                    # 调用的字典名
  prism: cangjie6                         # 棱镜文件名（编码索引）
  user_dict: cangjie6                     # 用户词典名
  
  # —— 通用设置 ——
  enable_sentence: true                   # 是否开启动态组句
  enable_user_dict: true                  # 是否开启用户词典
  enable_charset_filter: false            # 是否开启字符集过滤
  enable_completion: false                # 是否提前显示未完整输入的候选
  enable_encoder: true                    # 是否开启自动造词
  encode_commit_history: true             # 是否对已上屏的词自动造词
  max_phrase_length: 5                    # 最大造词长度
  sentence_over_completion: false         # 无全码时是否启用智能组句
  strict_spelling: false                  # 是否严格按拼写规则组词
  
  # —— script_translator 特有（拼音等） ——
  contextual_suggestions: true            # ★ 是否使用语言模型优化（需配合grammar）
  max_homophones: 7                       # 最大同音簇长度（语言模型用）
  max_homographs: 7                       # 最大同形簇长度（语言模型用）
  spelling_hints: 5                       # 指定字数内标注完整拼音
  always_show_comments: false             # 是否始终显示编码提示
  
  # —— table_translator 特有（形码等） ——
  disable_user_dict_for_patterns:         # 禁止某些编码写入用户词典
    - "^z.*$"
  
  # —— 显示格式 ——
  preedit_format:                         # 编码上屏前的显示格式
    - xform/^([a-z ])$/$1｜\U$1\E/
    - "xlit|ABCDEFGHIJKLMNOPQRSTUVWXYZ|日月金木水火土竹戈十大中一弓人心手口尸廿山女田止卜片|"
  
  comment_format:                         # 候选词注释的显示格式
    - "xlit|abcdefghijklmnopqrstuvwxyz|日月金木水火土竹戈十大中一弓人心手口尸廿山女田止卜片|"
  
  # —— 优先级 ——
  initial_quality: 0.75                   # 该翻译器候选的默认优先级
```



**副翻译器**（引擎列表中以 `@` 区分）：

yaml

```
pinyin:                                   # 翻译器名
  tag: pinyin                             # 作用范围（只处理带此tag的段落）
  dictionary: luna_pinyin                 # 调用的字典
  prefix: 'P'                             # 输入前缀（需配合recognizer）
  suffix: ';'                             # 输入后缀（需配合recognizer）
  tips: "【漢拼】"                         # 输入时显示的提示
  closing_tips: "【蒼頡】"                  # 完成输入时的提示
  enable_charset_filter: true
  preedit_format:                         # 该翻译器独立的格式
    - "xform/([nl])v/$1ü/"
```



#### 2.4.3 grammar（语言模型配置）

用于提升整句输入准确率：

yaml

```
grammar:
  language: wanxiang-lts-zh-hans          # 语言模型文件名
  collocation_max_length: 5               # 最大搭配长度
  collocation_min_length: 2               # 最小搭配长度
```



与 `translator` 中的 `contextual_suggestions: true` 配合使用。

### 2.5 其他组件

#### 2.5.1 key_binder（快捷键绑定）

yaml

```
key_binder:
  import_preset: default                  # 从默认配置导入
  bindings:
    # 选字相关（when: has_menu 表示只有候选菜单出现时生效）
    - {accept: semicolon, send: 2, when: has_menu}    # ; 选第2候选
    - {accept: apostrophe, send: 3, when: has_menu}   # ' 选第3候选
    - {accept: comma, send: Page_Up, when: has_menu}  # , 上一页
    - {accept: period, send: Page_Down, when: has_menu} # . 下一页
    
    # 开关切换（when: always 表示始终生效）
    - {accept: "Control+1", select: .next, when: always}  # Ctrl+1 切换下一候选模式
    - {accept: "Control+2", toggle: full_shape, when: always}
    - {accept: "Control+3", toggle: simplification, when: always}
    
    # 多选开关控制
    - {accept: "Control+4", set_option: zh_trad, when: always}
    - {accept: "Control+5", set_option: zh_cn, when: always}
    
    # 发送组合按键
    - {accept: "Shift+Return", send_sequence: "~", when: composing}
```



**when 的有效值**：

| 值          | 含义                   |
| :---------- | :--------------------- |
| `paging`    | 翻页状态（有更多候选） |
| `has_menu`  | 有候选菜单             |
| `composing` | 正在输入（有输入码）   |
| `always`    | 始终生效               |

**操作类型**：

| 操作            | 含义                           |
| :-------------- | :----------------------------- |
| `send`          | 发送按键                       |
| `send_sequence` | 发送一串按键                   |
| `toggle`        | 切换开关（开→关，关→开）       |
| `set_option`    | 开启指定选项（多选开关）       |
| `unset_option`  | 关闭指定选项（多选开关）       |
| `select`        | 选择候选（`.next` 表示下一个） |

#### 2.5.2 punctuator（标点符号）

yaml

```
punctuator:
  import_preset: symbols                  # 从外部导入标点配置
  
  half_shape:                             # 半角模式下的标点
    "'": {pair: ["「", "」"]}             # 成对符号，第一次按出「，第二次按出」
    "(": ["〔", "［", "【"]               # 单键多候选，弹出选单
    ".": {commit: "。"}                   # 直接上屏，不弹出选单（优先级最高）
    "/": "/"                              # 直接映射
    ",": "，"
    "?": "？"
  
  full_shape:                             # 全角模式下的标点
    ",": "，"
    ".": "。"
    "/": "／"
```



**三种映射模式**：

| 模式     | 写法                        | 效果                               |
| :------- | :-------------------------- | :--------------------------------- |
| 直接映射 | `",": "，"`                 | 按逗号直接输出中文逗号             |
| 选单模式 | `"(": ["〔", "［"]`         | 按左括号弹出多个候选               |
| 成对模式 | `"'": {pair: ["「", "」"]}` | 第一次按出左符号，第二次按出右符号 |

#### 2.5.3 recognizer（识别器）

识别特殊输入模式，配合 `affix_segmentor` 和 `matcher` 使用：

yaml

```
recognizer:
  import_preset: default
  patterns:
    # URL 直接上屏（不进入编码处理）
    url: "^(www[.]|https?:|ftp:|mailto:).*$"
    
    # 邮箱直接上屏
    email: "^[a-z][-_.0-9a-z]*@.*$"
    
    # 反查：反引号开头，字母结尾，可选分号
    reverse_lookup: "`[a-z]*;?$"
    
    # 拼音反查：`P 开头
    pinyin_lookup: "`P[a-z]*;?$"
    
    # 特殊符号输入：/ 开头
    punct: "/[a-z]*$"
```



#### 2.5.4 chord_composer（并击配置）

用于多键同时按下的输入方案（如宫保拼音）：

yaml

```
chord_composer:
  alphabet: "swxdecfrvgtbnjum ki,lo."    # 并击可用按键
  algebra:
    - 'xlit|swxdecfrvgtbnjum ki,lo.|sczhlfgdbktpRiuVaNIUeoE|'
    - xform/^zf/zh/
    - xform/^cl/ch/
    - xform/^([bpf])$/$1u/
  output_format:
    - "xform/^([a-z]+)$/$1'/"
  prompt_format:
    - "xform/^(.*)$/[$1]/"
```



### 2.6 外观与菜单

yaml

```
menu:
  page_size: 5                            # 每页候选数量
  alternative_select_labels: [①, ②, ③, ④, ⑤]  # 候选标签样式
  alternative_select_keys: ASDFGHJKL      # 备选选字键

style:                                    # 外观（实际在 squirrel/weasel 中配置）
  font_face: "HanaMinA, HanaMinB"
  font_point: 15
  horizontal: false                       # true=横排，false=竖排
  inline_preedit: true                    # 输入码是否内嵌
```



### 2.7 lua 自定义

Rime 支持通过 Lua 脚本深度自定义：

yaml

```
engine:
  processors:
    - lua_processor@my_processor
  segmentors:
    - lua_segmentor@my_segmentor
  translators:
    - lua_translator@get_date
  filters:
    - lua_filter@single_char_first
```



对应的 `rime.lua` 文件示例：

lua

```
-- 动态输入日期
function get_date(input, seg, env)
  local on = env.engine.context:get_option("show_date")
  if (on and input == "date") then
    yield(Candidate("date", seg.start, seg._end, os.date("%Y年%m月%d日"), " 日期"))
  end
end

-- 过滤非单字候选
function single_char_first(input, env)
  local on = env.engine.context:get_option("single_char")
  local cache = {}
  for cand in input:iter() do
    if (not on or utf8.len(cand.text) == 1) then
      yield(cand)
    else
      table.insert(cache, cand)
    end
  end
  for i, cand in ipairs(cache) do
    yield(cand)
  end
end
```



**Lua 函数的通用参数**：

- `input`：输入内容
- `seg`：当前段落信息（包含 start、end 等）
- `env`：环境对象，可访问 `engine.context` 获取上下文状态

**开关绑定**：通过 `env.engine.context:get_option("选项名")` 将 Lua 功能与开关/快捷键关联。

## 三、dict.yaml 完整详解

### 3.1 文件头信息

yaml

```
# Rime dict
# encoding: utf-8
# 此处可注释字典来源、变动记录等

name: cangjie6.extended                   # 字典内部名，与文件名一致
version: "0.1"                            # 版本号
```



### 3.2 字典配置

yaml

```
sort: by_weight                           # 排序方式：original 或 by_weight
use_preset_vocabulary: false              # 是否引入内置的"八股文"词库
vocabulary: custom_vocab.txt              # 引入自定义额外词库
max_phrase_length: 5                      # 最大词长
min_phrase_weight: 1                      # 最小词频阈值
import_tables:                            # 导入其他码表
  - cangjie6
  - cangjie6_extra
```



**sort 选项**：

| 值          | 含义                            |
| :---------- | :------------------------------ |
| `original`  | 按码表原始顺序（手动排序）      |
| `by_weight` | 按词频排序（weight 越大越靠前） |

**use_preset_vocabulary 与 vocabulary 的区别**：

| 设置                                                   | 含义                                         |
| :----------------------------------------------------- | :------------------------------------------- |
| `use_preset_vocabulary: true`                          | 自动引入 Rime 内置的八股文词库（含通用词频） |
| `use_preset_vocabulary: false` + `vocabulary: xxx.txt` | 不引入内置词库，改为引入自定义词库           |
| 两者都不设置                                           | 仅使用本文件中的码表数据                     |

> 注意：`use_preset_vocabulary` 和 `vocabulary` 不能同时使用。

### 3.3 列定义（columns）

定义码表文件中每列的含义（以 Tab 分隔）：

yaml

```
columns:
  - text    # 第1列：字/词
  - code    # 第2列：编码
  - weight  # 第3列：词频（影响排序）
  - stem    # 第4列：造词码（编码时取用的基础形式）
```



**各列的作用**：

| 列名     | 必填   | 用途                                  |
| :------- | :----- | :------------------------------------ |
| `text`   | **是** | 实际输出的文字内容                    |
| `code`   | **是** | 该字/词的编码                         |
| `weight` | 否     | 词频值，越大越靠前，默认 1            |
| `stem`   | 否     | 造词时的编码依据，通常省略则用 `code` |

### 3.4 编码器（encoder）

**作用**：基于已有单字编码，**自动生成词组编码**，实现用户输入词组时无需手动造词。

yaml

```
encoder:
  exclude_patterns:                      # 排除特定编码的参与造词
    - '^z.*$'                            # 排除以 z 开头的编码
    - '^x.*$'                            # 排除特殊功能码
  
  rules:
    # 二字词：取第一字首尾码 + 第二字首尾码
    - length_equal: 2
      formula: "AaAzBaBbBz"
      # Aa = 第1字首码, Az = 第1字尾码
      # Ba = 第2字首码, Bb = 第2字次码, Bz = 第2字尾码
    
    # 三字词：取第一字首尾码 + 第二字首尾码 + 第三字尾码
    - length_equal: 3
      formula: "AaAzBaYzZz"
      # 说明：Yz 表示倒数第二字的尾码，Zz 表示最后一字的尾码
    
    # 四至五字词：取首字首码 + 第二字尾码 + 第三字首码 + 倒数第二字尾码 + 最后字尾码
    - length_in_range: [4, 5]
      formula: "AaBzCaYzZz"
  
  tail_anchor: "'"                       # 结构分割符（仅用于仓颉）
```



**formula 中的符号含义**：

| 符号                        | 含义                 |
| :-------------------------- | :------------------- |
| `A`, `B`, `C`, ...          | 表示第1、2、3...个字 |
| `a`                         | 该字的首码           |
| `b`                         | 该字的次码           |
| `y`                         | 该字的倒数第二码     |
| `z`                         | 该字的尾码           |
| 大写表示取其码表中的第 N 列 |                      |

**实际例子**（仓颉）：

- 单字：「我」= `hqi`，「們」= `oan`
- 二字词「我們」：
  - 按公式 `AaAzBaBbBz`
  - 取「我」首码 `h` + 尾码 `i`
  - 取「們」首码 `o` + 次码 `a` + 尾码 `n`
  - 得到编码 `hioan`（实际还需考虑 tail_anchor）

**tail_anchor 的作用**：在仓颉中，`'` 用于区分编码的真正结尾和造词结构的边界。

### 3.5 码表数据格式

实际码表内容，每行一条记录，以 Tab 分隔各列：

yaml

```
# 格式：字词（Tab）编码（Tab）词频（Tab）造词码

個    owjr    246268    ow'jr
看    hqbu    245668
中    l       243881
呢    rsp     242970
來    doo     235101
嗎    rsqf    221092
爲    bhnf    211340

# 词组
我們    hioan    15000
中國    lgi      12000
```



**编写规范**：

- UTF-8 编码
- 每行一条记录
- 各列以 **Tab 符**（不是空格）分隔
- `#` 开头的行为注释
- 空行会被忽略

## 四、配置优先级与定制

### 4.1 文件优先级



1. **最高优先级：`{方案名}.custom.yaml`**
   这是针对**某个特定输入方案**（比如“明月拼音”`luna_pinyin.schema.yaml`）的个人补丁文件。它的修改只影响这一个方案，并且会覆盖所有全局设置。
2. **中优先级：`default.custom.yaml`**
   这是**全局**的个人补丁文件。你在这里做的任何修改，都会覆盖 `default.yaml` 中对应的全局设定。
3. **最低优先级：`default.yaml` 和 `{方案名}.schema.yaml`**
   这些是 Rime 自带的**基础配置文件**。它们是“原始模板”，通常不建议直接修改，因为软件更新时可能会被覆盖。

| 优先级   | 文件                                   | 说明           |
| :------- | :------------------------------------- | :------------- |
| **最高** | `{方案名}.custom.yaml`                 | 方案级个人补丁 |
| **中**   | `default.custom.yaml`                  | 全局个人补丁   |
| **最低** | `{方案名}.schema.yaml`、`default.yaml` | 系统默认配置   |

**原则**：所有个性化修改都应放在 `.custom.yaml` 文件中，不要直接修改 `.schema.yaml`。



这是 Rime 的一个核心设计哲学：**保护你的个性化设置**。

- **`default.yaml` 是“基础”**：它就像一张“毛坯房”的图纸。
- **`default.custom.yaml` 是“补丁”**：你可以在这个“毛坯房”图纸上，用 `patch` 指令贴上你的个性化“壁纸”和“家具布局”。只要你不删掉这个 `custom` 文件，无论 Rime 怎么更新替换 `default.yaml`，你的个性化设置都会在重启后重新生效，不会被弄丢。

### ✍️ 实际操作逻辑

举个例子，如果你想修改候选词数量，最安全的做法是：

1. 在用户文件夹里创建或编辑 `default.custom.yaml` 文件。
2. 在文件里按照 `patch:...` 的格式写入你的修改：

yaml

```
patch:
  "menu/page_size": 9  # 这就会覆盖 default.yaml 中默认的候选词数量
```

### 4.2 自定义补丁写法

yaml

```
# rime_ice.custom.yaml
patch:
  # 修改开关默认状态
  "switches/@0/reset": 1
  
  # 修改翻译器配置
  "translator/max_phrase_length": 8
  
  # 添加新的快捷键
  "key_binder/bindings/+":        # + 表示追加
    - {accept: "Control+Shift+1", toggle: simplification}
  
  # 添加新的过滤器
  "engine/filters/+":
    - lua_filter@my_filter
```



## 五、常用正则表达式（Perl风格）

Rime 配置中大量使用 Perl 兼容正则表达式：

| 元字符     | 含义               | 示例                       |
| :--------- | :----------------- | :------------------------- |
| `^`        | 行首（输入串开头） | `^[a-z]`                   |
| `$`        | 行尾（输入串结尾） | `[a-z]$`                   |
| `.`        | 任意单个字符       | `^.$`                      |
| `*`        | 0次或多次          | `[a-z]*`                   |
| `+`        | 1次或多次          | `[a-z]+`                   |
| `?`        | 0次或1次           | `[a-z]?`                   |
| `(...)`    | 捕获组             | `^([nl])` → 可用 `$1` 引用 |
| `[...]`    | 字符集             | `[a-z]`                    |
| `(?<=...)` | 正向预查           | `(?<=`)P[a-z]*` \|         |
| `(?<!...)` | 反向预查           | `(?<!`)P[a-z]*` \|         |

**Rime 特有的 `xlit` 和 `xform`**：

| 命令                                                         | 格式                        | 含义                       |
| :----------------------------------------------------------- | :-------------------------- | :------------------------- |
| `xlit`                                                       | `xlit/源字符集/目标字符集/` | 一对一替换（不保留原形）   |
| `xform`                                                      | `xform/正则/替换/`          | 正则替换（标准 Perl 替换） |
| `xlit` 与 `xform` 的区别：`xlit` 只能做简单的一对一映射，`xform` 可以做更复杂的匹配替换。 |                             |                            |

## 六、完整示例对照

### 6.1 cangjie6.schema.yaml（简化版）

yaml

```
schema:
  name: "蒼頡檢字法"
  schema_id: cangjie6
  version: "0.19"

switches:
  - name: ascii_mode
    reset: 0
    states: ["中文", "西文"]
  - name: full_shape
    states: ["半角", "全角"]

engine:
  processors:
    - ascii_composer
    - recognizer
    - key_binder
    - speller
    - punctuator
    - selector
    - navigator
    - express_editor
  segmentors:
    - ascii_segmentor
    - matcher
    - affix_segmentor@pinyin
    - affix_segmentor@jyutping
    - abc_segmentor
    - punct_segmentor
    - fallback_segmentor
  translators:
    - punct_translator
    - table_translator
    - script_translator@pinyin
    - script_translator@jyutping
  filters:
    - simplifier@zh_simp
    - uniquifier
    - cjk_minifier

speller:
  alphabet: zyxwvutsrqponmlkjihgfedcba
  max_code_length: 5

translator:
  dictionary: cangjie6
  enable_sentence: true
  enable_encoder: true
  max_phrase_length: 5
```



### 6.2 cangjie6.dict.yaml（简化版）

yaml

```
name: cangjie6
version: "0.1"
sort: by_weight
use_preset_vocabulary: false
columns:
  - text
  - code
  - weight

encoder:
  exclude_patterns:
    - '^z.*$'
  rules:
    - length_equal: 2
      formula: "AaAzBaBbBz"
    - length_equal: 3
      formula: "AaAzBaYzZz"
    - length_in_range: [4, 5]
      formula: "AaBzCaYzZz"

# 码表数据
個    owjr    246268
看    hqbu    245668
中    l       243881
```





# import_preset和_include 的区别


 `import_preset`：导入“预设模板”（套娃式替换）

- **本质**：它是一个 **“宏”或“函数调用”**。你把一套写好的配置参数**作为参数**传进去，工具内部用这套参数去渲染一个固定的模板结构。
- **关键特征**：**结构由预设定义，你只传值**。

**举个例子（OpenWrt 的构建配置风格）：**

yaml

```
# 预设定义（在某个核心文件里）
# presets.yaml
presets:
  base_router:
    cpu: "mips"
    flash: 16MB
    features: ["wifi", "switch"]

# 你的使用
import_preset: base_router
  cpu: "x86"        # 覆盖默认cpu
  flash: 32MB       # 覆盖默认flash
```



效果：最终生成的配置**只包含**预设里定义好的字段（cpu、flash、features），但你传的值（x86, 32MB）替换了预设的默认值。你**不能**在 `import_preset` 里添加预设没有的字段（比如 `usb_ports`），加了也会被忽略或报错。

------

 `__include`：包含另一个文件的内容（文本式拼合）

- **本质**：它是一个 **“文件读取器”**。它把另一个 YAML 文件里的所有内容**原封不动地**复制粘贴到当前位置。
- **关键特征**：**结构由被包含文件决定，你无权修改**。

**举个例子：**
假设有个文件 `common.yaml`：

yaml

```
wifi:
  ssid: "MyWiFi"
  password: "12345678"
```



在你的主文件里：

yaml

```
device:
  name: "Router"
  __include: common.yaml
```



效果：最终配置会变成：

yaml

```
device:
  name: "Router"
  wifi:
    ssid: "MyWiFi"
    password: "12345678"
```



被包含的内容**完全展开**，你无法在 `__include` 这一行修改 `ssid` 或 `password`。如果想改，只能去修改被包含的文件本身。





- 如果你的配置是**标准化的**（比如定义多个路由器型号，每个型号都有CPU、内存、接口数量），用 **`import_preset`**，这样能保证结构统一，避免漏字段。
- 如果你的配置是**碎片化的**（比如多个项目共用同一套代理设置、镜像源地址），用 **`__include`**，方便一处修改，处处更新。



教程：

[Rime_collections/Rime_description.md at master · LEOYoon-Tsaw/Rime_collections](https://github.com/LEOYoon-Tsaw/Rime_collections/blob/master/Rime_description.md)



