Skip to content

方案配置详解

高级主题

本文面向需要手动编辑方案配置文件的用户。普通用户通过设置工具和方案介绍页面即可完成日常配置。

每个方案有独立的 TOML 配置文件,位于 %APPDATA%\WindInput\schemas\ 目录:

文件方案
pinyin.schema.toml全拼
shuangpin.schema.toml双拼
wubi86.schema.toml五笔 86
wubi86_pinyin.schema.toml五笔拼音混输

格式兼容

方案文件现为 TOML 格式。旧版的 .schema.yaml 仍可被读取(同名时优先 .toml),字段名两种格式完全一致,下文示例以 TOML 给出。

五笔引擎配置

五笔相关的引擎配置在 wubi86.schema.toml[engine.codetable] 中:

配置项说明默认值
max_code_length最大编码长度4
auto_commit_unique四码唯一自动上屏false
top_code_commit五码顶字上屏true
punct_commit标点顶字上屏true
clear_on_empty_max四码空码自动清空false
show_code_hint显示编码提示true
single_code_input逐字键入模式(关闭前缀匹配)false
single_code_complete逐码空码补全(逐码模式下精确无候选时取更长编码首个候选)true
candidate_sort_mode候选排序模式:frequency(词频)、natural(自然顺序)frequency
z_key_repeatZ 键重复/学习true
dedup_candidates候选去重(按 text 保留先出现)true
skip_single_char_freq单字不自动调频(避免高频单字越用越靠前)false
load_mode码表加载模式由 schema 内部决定
prefix_mode前缀匹配模式:sequential / bfs_bucket / nonebfs_bucket
bucket_limitbfs_bucket 模式下每桶候选上限内部默认
weight_mode权重模式:global / inner_order内部默认
short_code_first短码优先(短编码候选靠前)由 schema 决定
charset_preference字符集偏好(同候选下优先显示的字符集)

临时拼音子配置 (temp_pinyin)

码表方案可在 [engine.codetable.temp_pinyin] 中启用"忘码时切到拼音输入":

toml
[engine.codetable.temp_pinyin]
enabled = true               # 是否启用临时拼音
schema = "pinyin"            # 使用的拼音方案 ID(默认 pinyin;已废弃, 推荐用全局 primary_pinyin)
字段说明默认值
enabled是否启用临时拼音 (五笔方案下按 ` 切换)true(向后兼容)
schema使用的拼音方案 ID全局 primary_pinyin 优先

设计取舍

临时拼音激活时, 短语词库 (PhraseLayer) 的命令短语不会被命中 (例如临时拼音里输 zzbd 不会看到"标点"字符组), 让输入流回归"纯拼音"语义; 简拼仍然保留。

混输引擎配置

五笔拼音混输在 wubi86_pinyin.schema.toml[engine.mixed] 中:

配置项说明默认值
primary_schema主方案(五笔)wubi86
secondary_schema辅助方案(拼音)pinyin
min_pinyin_length最短拼音编码长度2
codetable_weight_boost码表权重倍数10000000
show_source_hint显示匹配来源提示false
z_key_repeatZ 键重复/学习true
enable_abbrev_match启用简拼匹配(混输模式下默认关闭, 避免和五笔编码冲突)false
pinyin_only_overflow编码超过最大码长时仅查拼音true
enable_english启用英文候选(混输直接出英文词条)false

TIP

混输 boost (codetable_weight_boost) 是 层间隔离机制 —— 码表层 (含短语 + 用户词库 + 系统码表) 整体被压在拼音字之前, 让用户输码表编码时即便恰好与拼音冲突也能稳定靠前。该 boost 不写入存储, 用户在设置里看到的 weight 永远是 0~10000 那个值。

拼音引擎配置

全拼和双拼在方案文件的 engine.pinyin 中:

配置项说明默认值
scheme拼音方案:full(全拼), shuangpin(双拼)
show_code_hint显示编码提示true
use_smart_compose智能组词true
candidate_order候选排序:char_first, phrase_first, smartsmart
dict_format词库格式:dat (默认, 适合大词库), wdbdat

双拼额外配置:

toml
[engine.pinyin]
scheme = "shuangpin"

[engine.pinyin.shuangpin]
layout = "xiaohe"            # 双拼布局:xiaohe, ziranma, mspy, sogou, abc, ziguang

模糊音

模糊音在方案配置文件的 engine.pinyin.fuzzy 中设置。全拼和双拼方案支持以下 11 组模糊音:

模糊对配置项说明
z ↔ zhzh_z平翘舌
c ↔ chch_c平翘舌
s ↔ shsh_s平翘舌
n ↔ ln_l鼻边音
r ↔ lr_l边音
f ↔ hf_h唇齿音
an ↔ angan_ang前后鼻音
en ↔ engen_eng前后鼻音
in ↔ ingin_ing前后鼻音
ian ↔ iangian_iang前后鼻音
uan ↔ uanguan_uang前后鼻音

可通过设置工具的"模糊音"页面逐组启用或禁用。

编码器(五笔词组自动编码)

toml
[encoder]
max_word_length = 10            # 最大词长

[[encoder.rules]]
length_equal = 2                # 二字词取码规则
formula = "AaAbBaBb"            # 第一字前两码 + 第二字前两码

[[encoder.rules]]
length_equal = 3                # 三字词
formula = "AaBaCaCb"            # 前两字首码 + 第三字前两码

[[encoder.rules]]
length_in_range = [4, 10]       # 四字及以上
formula = "AaBaCaZa"            # 前三字首码 + 末字首码

公式语法:

符号含义
A, B, C, Z第 1、2、3、末个字
a, b该字的第 1、2 个编码

学习与调频

toml
[learning]
temp_max_entries = 5000         # 临时词库最大条目数
temp_promote_count = 5          # 选择几次后晋升到用户词库

# 拼音方案: 选词即学的自动造词
[learning.auto_learn]
enabled = false                 # 是否启用自动造词
count_threshold = 2             # 误选保护阈值
min_word_length = 2             # 最小造词字数
weight_delta = 20               # 每次选词权重增量
add_weight = 800                # 新词初始权重

# 码表方案: 连续单字 + 终止符 = 自动组词
[learning.auto_phrase]
enabled = false
min_phrase_len = 2              # 最小造词字数
max_phrase_len = 5              # 最大造词字数
add_weight = 800                # 新词初始权重
weight_delta = 20               # 每次命中权重增量
count_threshold = 2             # 误选保护阈值

# 自动调频 (按"用得越多排得越前"动态调整候选 weight)
[learning.freq]
enabled = false                 # 是否启用自动调频
protect_top_n = 0               # 锁定前 N 位候选位置 (默认不锁定)
half_life = 72                  # 半衰期 (小时)
boost_max = 2000                # 加成上限 (自动调频不会让一条词的 weight 涨过 2000)
max_recency = 300               # 时间衰减峰值
base_scale = 100                # base 系数
streak_scale = 50               # 连续选择系数
streak_cap = 250                # 连续选择上限

各字段说明:

auto_learn (拼音)

字段说明默认值
enabled是否启用自动造词false
count_threshold误选保护阈值(要被选过多少次才视为有效造词)2
min_word_length最小造词字数2
weight_delta每次选词权重增量20
add_weight新词初始权重800

auto_phrase (码表)

字段说明默认值
enabled是否启用false
min_phrase_len最小造词字数2
max_phrase_len最大造词字数5
add_weight新词初始权重800
weight_delta每次命中权重增量20
count_threshold误选保护阈值2

freq (自动调频)

字段说明默认值
enabled是否启用false
protect_top_n锁定前 N 位候选位置0 (不锁定)
half_life半衰期 (小时, 决定调频"记忆"长短)72
boost_max调频加成上限 (单条词 weight 最多被调到 +2000)2000
max_recency时间衰减峰值300
base_scalebase 系数100
streak_scale连续选择系数50
streak_cap连续选择上限250

临时词库

字段说明默认值
temp_max_entries临时词库最大条目数 (超限按 LRU 淘汰)5000
temp_promote_count临时词被选择 N 次后晋升到用户词库5

TIP

临时词库 (TempLayer) 是用户词库 (UserLayer) 的"前置队列": 新学的词先进临时层观察, 命中阈值后自动晋升。这避免一次性误选直接污染用户词库。

词库权重

方案中的 dictionaries 可以配置 weight_spec 控制词库权重分布:

toml
[[dictionaries]]
id = "pinyin_main"

[dictionaries.weight_spec]
median = 200                # 中位权重
max = 19260817              # 最大权重
mode = "log"                # 权重模式:linear(线性), log(对数)

权重作为排序序号

某些码表词库(如极点五笔)的权重并非真实词频,而是同编码内的重码序号(如 10/20/30/40)。这会导致前缀匹配时重码多的生僻字(权重被叠加到 40)排在重码少的常用字(权重 10)前面。

通过 weight_as_order 标记此类词库,启用后前缀匹配候选在同一剩余码长层内权重被统一,按码表文件的原始顺序排列,精确匹配不受影响:

toml
[[dictionaries]]
id = "wubi86_main"
weight_as_order = true      # 权重仅表示同码内排序序号,不参与跨码比较

[dictionaries.weight_spec]
median = 10
max = 890
配置项说明默认值
weight_as_order权重仅表示同码内排序序号,前缀匹配时抹平权重差异false

反查词库

拼音方案可以配置反查词库,在编码提示中显示其他方案的编码:

toml
[[dictionaries]]
id = "pinyin_main"

[[dictionaries]]
id = "wubi86_reverse"          # 五笔反查词库
reverse_lookup = true

拆字提示

五笔等形码方案可挂拆字数据库, 在候选条目上显示构字信息:

toml
[engine.chaizi]
db_path = "chaizi.db"           # 拆字数据库路径 (相对词库目录或绝对路径)
font_family = "PinyinSC.ttf"    # 显示拆字所用的字体 (空 = 用默认字体)
font_dw_name = "Source Han"     # DirectWrite 字体族名 (字体已装到系统时优先用)
字段说明
db_path拆字数据库文件路径
font_family字体文件路径 (落到词库目录)
font_dw_nameDirectWrite 字体族名, 字体已系统注册时优先使用

短语词库的存储

短语词库 (PhraseLayer) 是全局共享的 (不区分方案), 数据最终存放在 user_data.db 的 Phrases bucket 中, 编辑入口在 设置 → 词库 → 短语

启动时引擎会读 system.phrases.toml 作为系统种子, 把内置短语合并到 db 中:

路径角色
<安装目录>/data/system.phrases.toml程序自带的系统短语种子, 只读, 升级时随安装包替换
%APPDATA%/WindInput/system.phrases.toml用户目录的同名覆盖文件, 存在时优先使用 (用于自定义系统种子)

系统短语种子现为 TOML 格式, 每条短语用 [[phrases]] 表示:

toml
[[phrases]]
code = 'date'
text = '$Y年$M月$D日'
weight = 1000               # 0~10000 同 tier 排序权重, 默认 1000
position = 1                # 仅同 code 多条时 tie-break (升序)

不是用户编辑入口

旧版的 system.phrases.yaml 仍可被读取 (同名时优先 .toml)。但不要直接编辑该文件来添加自己的短语 — 它仅用作系统种子, 重装 / 升级时可能被覆盖, 且改动不会自动同步进 db。用户自定义短语请通过 设置 → 词库 → 短语 的 UI 添加, 它会直接写入 db, 跨方案立即生效。

短语 vs 用户词库

短语 (PhraseLayer) 全局共享, 不区分方案。每个方案的用户词库 (StoreUserLayer) 按方案 ID 隔离, 拼音家族 (全拼/双拼) 共享同一份, 详见 数据共享与隔离

数据共享与隔离

拼音家族共享用户数据

全拼 (pinyin) 与双拼 (shuangpin) 的用户词库、调频、临时词库统一存储在 pinyin bucket 下 (代码常量 PinyinSharedDictID)。这样双拼用户切到全拼仍能看到自己学过的词。

混输方案则与其主形码方案 (例如 wubi86_pinyinprimary_schema: wubi86) 共享用户数据 — 五笔学过的词在混输下立刻可用。

方案实际数据 bucket
pinyin (全拼)pinyin
shuangpin (双拼)pinyin (与全拼共享)
wubi86 (五笔)wubi86
wubi86_pinyin (混输)wubi86 (与五笔共享)

短语词库全局, 系统码表按方案

数据类隔离方式
短语词库 (PhraseLayer)全局, 所有方案共用
系统码表 (各方案 dictionaries)按方案
用户词库 / 临时词库 / 调频按方案数据 bucket (拼音家族 / 混输有共享, 见上表)

设计中的注意事项

临时拼音是"独立查询路径"

码表方案下进入临时拼音 (按 `) 时, 仅拼音词库参与查询。短语词库 (PhraseLayer) 的命令短语在临时拼音下触发, 例如临时拼音中输 zzbd 看到的是"祖祖辈辈"等拼音简拼候选, 而非"标点"字符组 nav。这是为了让临时拼音回归"纯拼音"语义。

简拼 (zg → 中国) 在临时拼音下保留

混输 enable_abbrev_match 默认 false

混输方案下简拼匹配默认关闭, 避免和五笔编码冲突 (例如 zgrm 是常用简拼但也是有效五笔编码)。如希望在拼音兜底时也支持简拼, 设 enable_abbrev_match: true

Z 键重复 vs 临时拼音

z_key_repeat: true 时, 输入 z 触发"重复上次上屏候选"; 临时拼音又用 z (或 `) 作为切换键。两个功能可以共存 — 引擎按"前缀有效性"做渐进决策: 如果 z 后续还能扩展出码表/短语候选则正常输入, 否则把首 z 视作临时拼音触发键。

短语候选不会被生僻字过滤

智能过滤 (码表方案下"看不到生僻字") 路径里, 短语永远保留, 也不计入"同编码下是否有常用字"的判定。这让用户配置 dz = 我的地址 不会副作用地改变同编码 (dz) 的码表过滤行为。

如需创建自定义方案,请参阅方案配置制作

Released under the MIT License.