引导键特殊模式
用引导键临时进入自建小码表(快符、生僻字等)的配置方法、退出条件与候选行为,含 0.115.0 配置格式变更的迁移对照
在码表方案下,按一个「引导键」临时进入另一套独立的小型码表,完成后自动退出回到原方案。常见用途:快速符号(俗称「快符」)、生僻字、专业术语缩写等。
配置分两处:方案文件的 [overlay] 段声明「本方案可被临时叠加进入」并描述进入期间的表现;引导键与直达热键写在 config.toml 的 [keys].key_actions。方案文件与词库要自己准备。
特殊模式默认为空,需要你自己配置
安装后没有任何可用的特殊模式——包括「快符」。它不是一个开箱即用的功能,而是一套让你自建小码表的机制。
启用需要你准备两样东西:一个带 [overlay] 段的方案文件(连同它的码表词库),以及 config.toml 里指向它的引导键。唯一预置的引导键模式是 ; 触发的「快捷」混输模式,见快捷输入。
0.114 及更早版本的配置需要手工改写
[[schema.special_modes]] 数组在 0.115.0 已废弃,不做自动迁移。升级后快符按下去只会打出引导符本身,必须按新格式重配一次——照着「0.115.0 配置格式变更」抄即可,一个模式约 5 行。
除了 [overlay] 段本身,其余都能在设置工具里配
方案文件写好 [overlay] 段之后,在方案页勾选「显示特殊方案」让它出现在列表里,选中后:
- 引导键 / 直达热键:设置 → 按键设置 → 引导键
- 进入即展示候选、候选排列:同一个对话框的 特殊模式 一节
「特殊模式」这一节只在方案已声明 [overlay] 时出现——「是不是特殊方案」是方案的固有属性,由方案文件决定,不是随手勾选的开关。所以第一次必须手写方案文件,之后才有图形界面可用。
注释模板两项没有图形界面,始终需要手写。
工作原理:
- 按下配置的引导键(如
\)进入对应特殊模式:编码为空时直接进入;已有候选时先上屏当前高亮候选,再进入模式 - 候选窗口显示模式徽标(如「快符」),此时输入的字符在该模式的码表中检索
- 上屏一个候选后自动退出,回到原方案;也可按
Esc手动退出
若引导键指向的方案不存在、未声明 [overlay] 或加载失败,该键不会被拦截,会按普通标点处理——这是判断配置是否生效的快捷方法:按下引导键却打出了标点,说明方案没接上。
和快捷输入的区别
快捷输入(; 触发)内置了数字转换、计算器、日期等功能,使用内置逻辑处理;特殊模式则是完全自定义的码表,适合放置任意词条,更灵活。
0.115.0 配置格式变更
只有从 0.114 及更早版本升级、且配过特殊模式的用户需要看这一节。 全新安装的用户直接看下面的配置。
0.114 及更早版本用 config.toml 里的 [[schema.special_modes]] 数组定义特殊模式。0.115.0 起该数组已废弃,且不做自动迁移——升级后原有的快符、生僻字表等会全部失效,需要手工改写一次。
症状
-
按引导键(如
\)不再进入模式,而是直接打出这个符号本身 -
直达热键按下去没有任何反应
-
启动日志里有一条告警,形如:
schema.special_modes 已废弃且不再生效(残留 1 条:quick_symbols)。 改法:在对应方案的 .schema.toml(或 schema_overrides/<id>.toml)加 [overlay] 段, 引导键与直达热键写进 keys.key_actions(如 backslash = "special:<方案id>")。
为什么不自动迁移
新家有两个(方案文件 + config.toml),而其中方案文件那一半属于用户数据目录里的另一批文件,改写它需要引入本项目从未有过的「一次性副作用迁移 + 迁移状态标记」机制。权衡下来:手工重配一个模式约 5 行,而自动迁移一旦写错就是静默改坏用户的方案文件。
旧字段不会被静默吞掉——它仍会被读出来、告警、然后忽略,所以你不会遇到「配置还在、看着像生效」的情况。
改法:完整前后对照
假设你原来配了一个快符模式。旧写法(config.toml,0.114):
# config.toml —— 这一整段现在要删掉
[[schema.special_modes]]
id = "quick_symbols"
name = "快符"
short_name = "符"
trigger_keys = ["backslash"]
schema = "quick_symbols"
hotkey = "ctrl+shift+u"
show_all_on_enter = true
candidate_layout = "vertical"新写法拆成两个文件。① 方案文件 %APPDATA%\WindInput\schemas\quick_symbols.schema.toml——加一段 [overlay],并确认 [schema] 段里有模式名:
# quick_symbols.schema.toml
[schema]
id = "quick_symbols"
name = "快符" # ← 原 special_modes 的 name
icon_label = "符" # ← 原 special_modes 的 short_name
hidden = true # 不出现在方案切换列表里(原本多半已经有)
[overlay] # ← 新增这一段,段存在即声明「我是特殊模式」
show_all_on_enter = true # ← 原样搬过来
candidate_layout = "vertical" # ← 原样搬过来
# 以下是你原有的 [engine] / [[dictionaries]] 等,不用动② config.toml——删掉整个 [[schema.special_modes]] 块,改在 [keys.key_actions] 里绑键:
# config.toml
[keys.key_actions]
backslash = "special:quick_symbols" # ← 原 trigger_keys
"ctrl+shift+u" = "special:quick_symbols" # ← 原 hotkey(没配过就不写这行)special: 后面跟的就是方案 id,与方案文件里的 [schema].id 一致。
逐字段对照
旧字段([[schema.special_modes]]) | 新位置 |
|---|---|
id | 删除——身份改用方案 id |
schema | 删除——模式就是那个方案本身,不再有引用关系 |
name | 方案文件 [schema].name |
short_name | 方案文件 [schema].icon_label |
trigger_keys = ["backslash"] | [keys.key_actions] 的 backslash = "special:<方案id>" |
hotkey = "ctrl+shift+u" | 同上,键名写成组合键:"ctrl+shift+u" = "special:<方案id>" |
show_all_on_enter | 方案文件 [overlay] 段,原名不变 |
candidate_layout | 方案文件 [overlay] 段,原名不变 |
comment_template_vertical / _horizontal | 方案文件 [overlay] 段,原名不变 |
三个容易踩的地方
① 一个方案只能是一个模式了
旧格式允许两个 [[schema.special_modes]] 条目引用同一个 schema,各自带不同的引导键与 show_all_on_enter。新格式下实例就是方案,做不到这一点。
如果你原来这样配过,需要把方案文件复制一份、改成不同的 id(文件名前缀必须与 id 一致),两份各写各的 [overlay]。两份可以指向同一个词库文件,不必复制词库;但用户词、词频与候选调整是按方案 id 分开记的,两份之间不共享。
② 模式名以方案文件为准了
候选窗上的模式徽标现在取方案文件的 [schema].name,不再取 special_modes 里的 name。这两处原本可以不一致——如果你的方案文件里写的是别的名字(比如 name = "符号表"),迁移后徽标会跟着变。要保持原样就把 [schema].name 改成你习惯的那个。
③ 字母引导键要另写一处
旧的 trigger_keys 里如果配过字母(如 z),不能直接搬进全局 [keys.key_actions]——字母是编码键,全局配了会让它在所有方案里都打不出编码。字母要写进方案级的 [key_actions] 段,且特殊模式不适合用 z,详见字母键的让位规则。
改完怎么验证
- 重启输入法(或重新登录),让配置重新加载
- 在中文输入状态下按引导键——应当出现模式徽标(如「快符」)
- 若仍打出符号本身,说明没接上。按这个顺序查:方案文件有没有
[overlay]段 →special:后面的 id 与[schema].id是否逐字相同 → 启动日志里还有没有那条special_modes 已废弃告警(还有就说明旧块没删干净)
改完之后,show_all_on_enter 与 candidate_layout 两项就能在设置工具里直接调了:方案页 → 选中该方案 → 设置 → 特殊模式。
配置
一、方案文件声明 [overlay] 0.115 新增
在 <方案id>.schema.toml 里加一段 [overlay]。段存在即声明「本方案可被临时叠加进入」——它同时是特殊模式列表的枚举依据:没有这一段的方案,配了引导键也进不去。
# quick_symbols.schema.toml
[schema]
id = "quick_symbols"
name = "快符" # 候选窗口显示的模式名
icon_label = "符" # 模式指示短称(留空取 name 首字)
hidden = true # 不出现在方案切换列表里(见下文)
[overlay]
show_all_on_enter = false # 进入模式即展示候选(可选,默认 false,见下文)
candidate_layout = "follow" # 候选窗布局(可选,默认 follow,见下文)模式的名字与短称直接取该方案自己的 [schema] 元信息,不再另写一份。真正的码表与全码上屏策略仍在同一个方案文件的 [engine.codetable] 里,与该方案作普通方案使用时完全一致。
字段清单见方案文件 · overlay 段。这一段也可以写进用户覆盖层 schema_overrides/<方案id>.toml——设置工具改的就是那里,方案文件本身不动。
二、config.toml 绑引导键
[keys.key_actions]
backslash = "special:quick_symbols" # 引导键:\ 进入快符
"ctrl+shift+u" = "special:quick_symbols" # 直达热键(可选)key_actions 是「键 → 干什么」的通用表,特殊模式只是它的动词之一,完整值域见按键功能表。动词写作 special:<方案id>,冒号后面就是上一步那个方案的 id。
表以键为主键,一个键只能有一个动作——所以不存在「两个模式抢同一个引导键」的情况,配置文件层面就消解了。
引导键取键名,支持这些常用符号键:
| 键名 | 按键 |
|---|---|
backslash | \ |
backtick / grave | ` |
semicolon | ; |
quote | ' |
comma | , |
period | . |
slash | / |
lbracket | [ |
rbracket | ] |
minus | - |
equal | = |
别用字母键进特殊模式
字母键要写进方案级 [key_actions](字母能不能借用取决于码表),且只有在该码表里是死码时才进得去——是活码就让位给正常输入。
z 尤其不行:出厂自带 37 条 zz 开头的标点短语,它在任何方案里都是活码;而 special: 是唯一没有夺取回路的动词,让位一次就等于永久进不去。详见字母键的让位规则。
特殊模式请用 \、` 这类在码表里不产出编码的符号键。
按键冲突
若引导键已被次选键、翻页键、临时拼音等功能占用,设置工具会提示冲突。同一个键只能分配给一项功能。
退出方式
特殊模式的退出条件比"选中候选"要多,完整清单:
| 操作 | 行为 |
|---|---|
| 选中候选(空格 / 数字键 / 次选键) | 上屏并退出 |
Esc | 丢弃输入,退出 |
| 退格 / 删除把编码删空 | 退出(编码已空时按退格也退出) |
| 空格且当前无候选 | 退出 |
Enter 且编码非空 | 上屏编码原文 |
Enter 且编码为空 | 上屏引导符本身并退出(回车行为设为「清空」时则只退出) |
| 再按一次引导键(编码为空时) | 输出该标点并退出 |
| 输入其他标点 | 上屏当前高亮候选 + 转换后的标点,退出 |
| 切换焦点 / 切换模式 | 自动退出 |
此外,该方案的全码策略触发时会自动上屏并退出,见下文自动上屏策略。
直达热键
除引导键外,还可给特殊模式配一个专用直达热键——在同一张 key_actions 表里把键名写成组合键即可,与引导键共存:
[keys.key_actions]
backslash = "special:quick_symbols"
"ctrl+shift+u" = "special:quick_symbols"按热键直接进入该模式,且组合区不写入引导符(引导键进入时首位是引导符,热键进入则从空编码开始)。仅中文模式下生效,并走系统级全局拦截,以穿透 QQNT / Tabby 等宿主的同名加速键。
同一张表里的条目按键的形态自动分流:带 Ctrl / Alt / Shift 的走热键通路,单个符号键走引导键链,不需要你指定。
自动上屏策略
特殊模式输入时是否自动上屏,由该方案的 [engine.codetable] 全码策略决定,与它作为普通方案使用时一致:
- 全码唯一自动上屏:候选唯一且无更长前缀时自动上屏,适合符号、常用词
- 固定码长自动上屏:达到指定码长且候选唯一时自动上屏,适合定长码表
- 手动选择:始终按数字 / 空格选择,适合需要精确控制时
标了 hidden = true 的方案不会出现在正常的方案切换列表中,只在按下引导键时懒加载触发。hidden 与 [overlay] 是两个正交的属性:前者管「列不列在方案列表里」,后者管「能不能被引导键叠加进入」。特殊模式通常两个都要。方案文件与码表词库的写法见输入方案管理。
精确匹配与空码补全
特殊模式的候选检索是否走精确匹配、以及空码时是否补全后续编码,同样由该方案的 [engine.codetable] 决定,规则与它作普通方案时完全一致(见码表引擎配置):
single_code_input:精确匹配模式,关闭前缀枚举,只显示编码完全匹配的候选single_code_complete:精确匹配下当前编码无精确候选、但更长前缀有候选时,补一条「首位后续码」。任意未满码长都会补(不限某个具体码长),只有打满全码仍无候选时才不补
这些项在设置工具里也能配
不必手写:在方案页勾选「显示特殊方案」,选中该方案 → 设置 → 码表配置,打开「自定义码表配置」即可逐项调整(顶码上屏、精确匹配、调频等)。见方案级码表配置。
写进的是用户覆盖层 schema_overrides/<方案id>.toml,与本页说的 [engine.codetable] 是同一组字段、同样的语义。
特殊方案不继承全局码表配置
声明了 [overlay] 的方案折叠 [engine.codetable] 时以内置默认值为基线,不叠加全局 schema.codetable。它们是几十条的小符号表,而全局基线是按五笔那种数万条全码表调的——共用一份的后果是「改五笔的精准匹配,快符跟着变」,而改的人根本意识不到自己动了另一个表。
判据是 [overlay] 段,与写没写 hidden 无关:hidden 只决定列不列进方案切换列表。隐藏但没有 [overlay] 的码表方案(比如只作快捷输入成员用的小表)照常跟随全局。
所以设置工具里对五笔开启的「精准匹配」不会流到特殊模式,特殊模式也不会拿到全局的 punct_commit、z_key_repeat 等出厂值。要什么就在该方案上显式写:方案文件 <方案id>.schema.toml 的 [engine.codetable] 段,或用户覆盖层 schema_overrides/<方案id>.toml 的 [codetable] 段。
特殊方案没写时用的基线,与全局出厂值只有一处不同:
| 字段 | 特殊方案基线 | 全局出厂值 |
|---|---|---|
top_code_commit | true | true |
punct_commit | true | true |
single_code_complete | true | true |
single_code_input | false | false |
show_code_hint | true | true |
z_key_repeat | false | true |
z_key_repeat(z 键重复上一次上屏)对小符号表没有意义——z 在那里多半是个正经编码,故基线关掉它。
其余项与出厂值一致:「不继承全局」的意义是你改了全局之后特殊方案不跟着变,而不是让它的出厂表现与普通方案不同。需要与基线不同的就显式写:
[engine.codetable]
single_code_input = true进入即展示候选
默认情况下,进入特殊模式后候选窗为空,敲入编码才出候选。把方案 [overlay] 段的 show_all_on_enter 设为 true(或在设置工具的 特殊模式 → 进入即展示候选 里勾上),则一进入就展示该方案码表的候选,可直接翻页浏览——适合快符、生僻字分类符号这类小码表。
展示数量遵循该方案的 single_code_input:
- 非精确匹配模式:展示码表首页候选,按每页候选数分页浏览
- 精确匹配模式:最多展示 1 条(与
single_code_complete「取首位后续码」同语义)
仅宜小码表
show_all_on_enter 面向小符号表。若引用的是大码表(成千上万条),进入时会遍历整表取首页,有一定开销,不建议开启。
候选窗布局
[overlay] 段的 candidate_layout 决定进入本模式期间候选窗的排列方向,退出后自动恢复。设置工具里对应 特殊模式 → 候选排列 下拉:
| 取值 | 含义 |
|---|---|
follow(默认) | 跟随全局 ui.candidate.layout——你改全局,本模式跟着改 |
vertical | 本模式期间强制竖排 |
horizontal | 本模式期间强制横排 |
每个特殊模式各设各的:快符表可以竖排、生僻字表可以横排,互不影响。
follow 与 vertical 的区别只在全局本身是竖排时才显现——前者跟着全局变,后者恒定竖排。搭配 show_all_on_enter = true 时通常设 vertical:一进入就铺开的符号表,竖排一屏能看到更多条目。
这是所有模式共用的机制
临时拼音、临时英文、快捷输入也各有同名的 candidate_layout,取值与语义完全一致,只是各住各的配置段——见候选布局总表。
注释模板
[overlay] 段还可以覆盖本模式期间的候选注释模板,横竖各配一份,退出自动恢复。无图形界面,只能手写:
[overlay]
comment_template_vertical = "${code_hint|code}"
comment_template_horizontal = ""三态语义(不写=跟随全局 / 写模板=本模式改用它 / 写空串=本模式不显示注释)与其它模式完全一致,见模式级注释模板。
候选行为
特殊模式的候选与主方案完全隔离:
- 调频与候选调整归属特殊方案自身 —— 见下方调频
- 不做简繁变体展开 —— 即使开启了简繁转换,特殊模式的候选也不会展开繁体变体(临时拼音与快捷输入模式则会)
调频
特殊模式的词频记账、候选调整(置顶/删除)、用户词库都记在该方案自己名下,与主方案互不干扰——它与五笔是同一层级的东西,只是用特殊按键进入。
所以设置工具的词库管理里能直接选中特殊方案,管它自己的用户词库、词频与候选调整。
默认不开。小符号表的顺序往往是作者精心排过的,调频会打乱它。
要开,在设置工具里是 选中方案 → 设置 → 码表配置 → 自定义码表配置 → 设置 → 词频调整;手写则是该方案的 [engine.codetable.frequency] 段:
[engine.codetable.frequency]
enabled = true
strategy = "position" # 建议:每用一次前移一半,久不用回落该段逐字段稀疏:写出来的覆盖基线,没写的跟随。取值语义与码表调频完全一致。
这是所有码表方案都有的能力
[engine.codetable.frequency] 不是特殊方案专属——任何码表方案都能用它给自己单独设一套调频。普通方案的基线是全局 schema.codetable.frequency,特殊方案的基线是内置默认。
想调整的是初始顺序而非使用频率,用该方案自己的 base_sort / base_order / default_weight。
引导符只作显示,不参与检索:按 \ 后输入 bd,查询的是 bd 而不是 \bd。
词库条目里的 $CC / $AA / $SS 语法在特殊模式下同样有效,见命令直通车。