输入行为配置
input 域全部配置项——标点、智能符号、自动配对、联想、临时英文/拼音、emoji、Unicode、网址、邮箱、简繁、命令栏
[input] 域涵盖输入行为的方方面面:全局按键语义(回车 / 空格 / 小键盘 / 候选过滤)、启动默认状态、标点与智能符号、自动配对、临时英文 / 临时拼音、网址输入、简入繁出、命令栏与短语前缀。这里的配置与具体方案无关,对所有方案统一生效。
默认值来源
本页默认值以系统预置 data/config.toml 的 [input] 段为准。未写进预置文件的字段(如 top_commit_mode、temp_pinyin.hotkey),默认值取自程序内置代码默认,已在对应行说明。
全局输入行为
顶层四个按键语义键 + 顶码上屏策略。
[input]
filter_mode = "smart" # 候选过滤模式
rare_phrase = "keep" # 含生僻字的词组要不要跟着一起过滤
enter_behavior = "commit" # 有编码时回车的行为
space_on_empty_behavior = "commit" # 有编码但无候选时空格的行为
punct_on_empty_behavior = "clear" # 有编码但无候选时标点键的行为(出厂即丢弃废码)
numpad_behavior = "direct" # 小键盘按键语义
numpad_half_width = false # 全角态下小键盘仍出半角
english_case_cycle_key = "" # 打英文时切换候选大小写档位的键(留空 = 关)
commit_newline = "keep" # 上屏文本里的换行用什么字符表达
# top_commit_mode = "direct_commit" # 内部/实验项,见下方 Callout| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
filter_mode | 枚举 | gb18030 / general / smart | "smart" | 候选过滤模式:gb18030 = 不过滤(全集);general = 只保留常用字;smart = 智能过滤(同一编码下存在常用候选时过滤掉非常用的)。⚠️ 自 0.122 起这三档只裁单字——含生僻字的词组另由下一行的 rare_phrase 决定 |
rare_phrase 0.122 新增 | 枚举 | keep / filter | "keep" | 含生僻字的词组要不要吃 filter_mode 那一刀:keep = 整词放行,词库收录的词照样打得出来,过滤只作用在单字上;filter = 与单字同判,整串每个字都在通用规范汉字表里才留(0.121 及以前的行为)。与 filter_mode 正交,不是它的第四个档:那个决定「什么算该滤」,本项决定「词要不要吃这一刀」,两者可任意组合。⚠️ keep 下,词里含你在候选右键里手动标成生僻的字也照样放行;单字被标成生僻仍照滤,两者不相干 |
enter_behavior | 枚举 | commit / clear | "commit" | 有编码时按回车:commit = 上屏「已转换前缀 + 剩余原码」;clear = 清空编码、不上屏 |
space_on_empty_behavior | 枚举 | commit / clear | "commit" | 有编码但当前无候选时按空格:commit = 上屏「已转换前缀 + 剩余拼音原码」;clear = 清空编码 |
punct_on_empty_behavior 0.118 新增 | 枚举 | commit / clear / clear_no_input | "clear" | 有编码但当前无候选时按标点/符号键:commit = 上屏「已转换前缀 + 剩余原码」再接标点;clear = 丢弃编码,只上屏标点;clear_no_input(0.119 起)= 丢弃编码,标点本身也不上屏,整个按键当没按过。移动端出厂为 commit。与 schema.codetable.punct_commit 不同——后者关掉是吞键但编码留着继续打,clear_no_input 是吞键且丢弃编码 |
numpad_behavior | 枚举 | direct / follow_main | "direct" | 小键盘按键语义:direct = 小键盘数字键直接输出数字(不当选词 / 翻页键);follow_main = 小键盘键重写为主键盘等价键,跟随主键盘语义 |
numpad_half_width 0.120 新增 | 布尔 | — | false | 开启后,小键盘的 0–9 与 . + - * / 在全角状态下仍输出半角原形,且整条标点流水线一并跳过(自定义标点映射、中文标点、全半角转换三步都不走)。与 numpad_behavior 正交,见小键盘恒半角 |
english_case_cycle_key 0.121 新增 | 字符串(隐性枚举) | "" / capslock / tab / enter / space / escape | "" | 打英文时(英文方案或临时英文)临时夺取哪个键,在「跟随输入 → 全大写 → 全小写」三档之间循环,一次组合结束即复位。留空 = 关闭。键即开关,没有另一个启用项。Windows 建议 capslock,macOS 上 CapsLock 到不了输入法(系统只传锁定态、不传按键),建议 tab。⚠️ 被夺取的键在打英文期间用不出原本的语义(capslock 的大写锁定、tab 的辅助码 / 配对跳出 / 会话动作),其余时候一律照旧;撞车时启动会告警。详见临时模式 · 切换候选大小写的键 |
commit_newline 0.122 新增 | 枚举 | keep / cr / lf / crlf | "keep" | 上屏文本里的换行用什么字符表达:keep = 原样透传,词条里写什么就上屏什么;cr / lf / crlf = 一律折成该形态。0.121 及以前是无条件折成 cr,见上屏换行的字符样式。⚠️ 仅 Windows 生效——macOS 的输入法框架用 LF,不参与本项 |
top_commit_mode | 枚举 | pre_confirm / direct_commit | "direct_commit" | 顶码上屏时「已确认文字」如何落到宿主。内部 / 实验项,见下方 Callout |
智能档不再「打得越全反而越不出」 (0.114)
smart 档按「同一来源 + 同一编码」分组,组内有常用词就滤掉非常用词。0.113 及以前,同一个字在不同长度的输入下会落进不同的分组——五笔的「桜」(sivg)打 siv 能出、打全 sivg 反而消失,因为打 siv 时同码位的常用字「档」被上游的去重整条丢掉了,「桜」成了孤儿码而被放行。
0.114 让候选记住自己被去重时占用过的全部码位,合并到幸存者身上,过滤时一并遮蔽。同一个字打得越全,出的候选只会更少或不变,不会反而多出来。
跨来源的码位不合并:码表码与拼音码不同域,混输下 wang 两边都合法,合并会给码表凭空造出「该码位有常用字」的假事实、误滤同码的码表生僻字。
小键盘恒半角 0.120 新增
开着全角时,小键盘打出来的还是 123,不是 123。
这一项的语义是设备级而不是字符级:小键盘的用途就是录数字——金额、编号、日期——全角数字在表格和编号栏里几乎总是错的;而开全角通常只是为了排正文。所以它单独拎出来,不跟主键盘走。
与 numpad_behavior 是两根互不干涉的轴:即使设成 follow_main(小键盘当主键盘用),小键盘照样能选词、翻页,只有真正落到出字那一步才改成半角。
只管「按一下直接上屏」的那条路
临时英文、网址输入、快捷输入这些先攒进缓冲、整串再上屏的模式不受这个开关影响——缓冲里只存字符不存来源,abc12 里的 12 是不是小键盘打的已经无从分辨。这是能力边界,不是漏接。
上屏换行的字符样式 0.122 新增
词条、短语、命令直通的产物里可以带换行,而「换行」在不同程序的文本模型里不是同一个东西:
| 文本模型 | 换行是什么 | 代表程序 |
|---|---|---|
| 富文本 | 段落边界就是 CR,LF 落进去不构成换行(Word 里渲染成一段类似 Tab 的空白) | Word、WPS 文字、各类 RichEdit 控件 |
| 纯字节 | 写进去什么就存什么,任何转换都是在改写你的数据 | VS Code、终端、浏览器输入框 |
0.121 及以前一律折成 CR,于是在第二类程序里,带换行的短语上屏后行尾被静默改写。0.122 起出厂改为 keep(原样透传),富文本程序由按应用的名单单独指定:
# compat.toml
[[commit_newline]]
process = "WINWORD.EXE"
style = "cr"出厂名单只有 WINWORD.EXE——同一次实测里记事本与 WPS 文字都能正常分段,所以 WPS 刻意不在名单上。写法与 compat.toml 其余段一致,见应用兼容配置。
为什么出厂不是继续转 CR
两个方向的漏配代价不对称:名单里漏一个富文本程序,你立刻看得见换行显示不对,加一行即可;反过来默认转换而漏掉一个按字节存储的程序,行尾被改写却看不出来,可能很久之后才发现。可见的失败优于静默的失败。
内部项:top_commit_mode
input.top_commit_mode 不在系统预置 config.toml 中,也不在设置工具开放,属内部 / 实验字段,仅可手改。direct_commit(默认)在顶码时真提交、靠隔一拍消息泵躲开 diff 合并,无下划线歧义、WPS 不清空;pre_confirm 留在 TSF 组合态延迟提交,但部分宿主会整段画下划线、WPS 智能标点顶屏会清空。除非排查特定宿主兼容问题,否则无需改动。
检索范围临时放宽(input.scope_relax) 0.114 新增
filter_mode = "smart" 的增强。智能档会滤掉「同码位已有常用字」的生僻字,代价是唯一编码被占的字彻底打不出(如五笔「桜」sivg 与常用「档」同码)。放宽完全由用户主动触发:候选窗内翻页翻到底,再按一次向后翻页键,即把被滤掉的字追加到列表末尾;本次组合结束(上屏 / 取消)后自动恢复。刻意不做任何自动行为。
[input.scope_relax]
page_end_key = true # 末页再按向后翻页键 → 临时放宽
prefix = "·" # 放宽候选的前缀标注,空串 = 不标注| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
page_end_key | 布尔 | — | true | 末页再按向后翻页键即临时放宽。候选不足一页时同样适用(那时只有一页,一样翻不动) |
prefix | 字符串 | — | "·" | 放宽放出来的候选的前缀标注,用于与正常候选区分;空串 = 不标注 |
联想(input.association) 0.117 新增
上屏之后,按刚上屏的内容再给一批候选。分两档:词语联想把上文当前缀,从词库里找以它开头的更长的词(打「中」提示「中国」「中间」);智能联想把上文当上下文,预测接下来该出什么词或标点。
[input.association]
kind = "off" # 联想类型(兼任总开关)
mode = "one_shot" # 一次性 / 持续联想
max_count = 9 # 候选条数上限
space_commits = true # 空格上屏当前高亮的联想候选
enter_cancels_only = false # 回车:false = 收窗并照常换行/发送
backspace_cancels_only = true # 退格:true = 只收窗,不删字
hide_after_ms = 5000 # 显示多久后自动收起;0 = 不自动收起
hint = "联想输入" # 联想时编码栏显示的标识;空串 = 不显示
prefix = true # 来源:词库里以上文为前缀的更长的词
punct = false # 来源:标点与符号(桌面默认关,移动端开)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
kind | 枚举 | off / word / smart | "off" | 联想类型,兼任总开关(off 即关) |
mode | 枚举 | one_shot / continuous | "one_shot" | one_shot = 只出一次,任何非选词动作即退出;continuous = 选中后拿它当新上文接着给(「中」→「中国」→ 以「中国」开头的词) |
max_count | 整数 | — | 9 | 候选条数上限。各来源按下方书写顺序依次取配额,取不满的名额顺延给后一个来源 |
space_commits | 布尔 | — | true | 空格是否上屏当前高亮的联想候选。关掉则空格照常出空格,联想窗同时收起 |
enter_cancels_only | 布尔 | — | false | 联想窗弹出时按回车:false = 收窗,同时回车照常换行 / 发送;true = 只收窗、把回车吃掉,要按第二次才生效 |
backspace_cancels_only | 布尔 | — | true | 联想窗弹出时按退格:true = 只收窗、不删字;false = 收窗并删掉刚上屏的那个字 |
hide_after_ms | 整数 | — | 5000 | 联想窗显示多少毫秒后自动收起;0 = 不自动收起 |
hint | 字符串 | — | "联想输入" | 联想时在编码栏显示的标识;空串 = 不显示 |
prefix | 布尔 | — | true | 来源:词库里以上文为前缀的更长的词——词语联想就是它 |
punct | 布尔 | — | false | 来源:标点与符号(静态规则表)。桌面默认关,移动端在 [mobile.association] 里开 |
回车与退格的默认值为什么相反
两项的取值语义完全对称,出厂默认却一个透传(回车)一个吃键(退格),这是刻意的。
回车是终结性动作——按它是要发送或换行,而联想窗是输入法自己弹出来的、用户并没有在选词,让它吞掉一次回车等于让一个「建议」挡住了正事。退格的透传则是删掉刚上屏的字,不可逆;联想窗弹出时手正停在刚打完的字上,误触若直接删字,代价比多按一次键大得多。
两项都可以按自己的习惯改。
为什么没有单独的「启用」开关
kind 同时表示开与关:拆成「启用 + 类型」两个字段,会立刻产生「开着但类型没配」这个没有正确答案的状态。要关闭就写 kind = "off"。
两个来源开关只在智能联想档生效
词语联想按定义只用 prefix 一个来源,在那一档下开着 punct 也不会出标点。这两项都不在设置界面开放,需要时手改配置文件。
当前的实际效果:punct 在桌面默认关 ⇒ 桌面上智能联想给出的东西与词语联想相同。要在桌面看到标点联想,得手动把 punct 改成 true。
桌面端默认关闭
候选窗是浮层,联想常驻会挡住正文;而且它会占用数字键——上屏后再按数字,开着时是选联想词、关着时是打数字,对既有用户是突发的行为变化。移动端没有这两个顾虑,故默认智能联想。
移动端取值(mobile.association)
[input.association] 是桌面基线。移动端只有 kind 与 mode 两项取值不同,写在文件末尾的独立段里;其余七项两端一致,不重复声明。
[mobile.association]
kind = "smart" # 移动端:智能联想
mode = "continuous" # 移动端:持续联想
punct = true # 移动端:出标点(桌面为 false)桌面端完全不读 [mobile] 域,改它对桌面没有任何影响;反之移动端读到这三个键就用它们的值,其余键仍取 [input.association]。
punct 分平台的理由是两种键盘的成本不同:实体键盘上标点一键可达,打完一个字就弹一串标点干扰远大于收益;软键盘上打标点要切键盘层,从候选里点走反而省事。
启动默认状态(input.default)
程序启动 / 输入法激活时的初始中英、全半角、标点状态。
[input.default]
remember_last_state = false # 记忆前次状态
chinese_mode = true # 默认中文输入
full_width = false # 默认全角
chinese_punct = true # 默认中文标点
state_scope = "global" # 中英状态作用域| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
remember_last_state | 布尔 | — | false | true = 启动 / 激活时恢复上次的中英 / 全半角 / 标点;false = 每次激活重置为下方默认值 |
chinese_mode | 布尔 | — | true | 默认进入中文输入模式 |
full_width | 布尔 | — | false | 默认全角 |
chinese_punct | 布尔 | — | true | 默认中文标点 |
state_scope | 枚举 | global / app | "global" | 中英状态作用域:global = 所有应用共享(默认);app = 每个应用各自记忆中英文(会话级) |
标点(input.punct)
标点随中英切换、数字后智能英文标点、四态自定义映射。
[input.punct]
follow_mode = false # 标点随中英模式切换
smart_after_digit = true # 数字后标点智能直出英文
smart_list = ".,:" # 参与「数字后智能英文标点」的标点集合
custom_enabled = false # 自定义标点映射总开关
# custom_mappings 为映射表,设置页表格编辑,此处不内联| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
follow_mode | 布尔 | — | false | 标点随中英模式切换(中文模式出中文标点,英文模式出英文标点) |
smart_after_digit | 布尔 | — | true | 数字后的标点智能直出英文 |
smart_list | 字符串 | — | ".,:" | 参与「数字后智能英文标点」的标点集合 |
custom_enabled | 布尔 | — | false | 自定义标点映射总开关;关闭时全部走内置默认转换 |
custom_mappings | 映射表 | — | {}(空表) | 四态标点自定义映射:key = 源字符(引号用 "1/"2/'1/'2 区分左右),value = [中文半角, 英文全角, 中文全角, 英文半角]。默认空表,在设置页表格编辑 |
这两项可以被方案整份换掉
从 0.119 起,方案文件可写 [punct.custom_mappings] 声明自己的一份表。切到那个方案时,本节的 custom_mappings 与 custom_enabled 一起不参与——是整份替换,不是逐行合并。
follow_mode / smart_after_digit / smart_list 没有方案级,恒取本节的值。
智能符号(input.symbol)
同一标点在时限内连按两次,将前一个删改 / 替换为另一种形态。三个总开关互相独立,各管一种上下文,都默认关。
[input.symbol]
smart_mode = false # 中文标点状态:连按 → 换英文
smart_timeout_ms = 500 # 连按判定时限(毫秒)
smart_chars = "。,?!:;、~¥·……——" # 参与转换的中文标点集合
smart_method = "delete_replace" # 替换方案
english_punct_mode = false # 中文输入 + 标点切英文:连按 → 换中文
english_mode = false # 英文输入模式:连按 → 换中文
english_chars = ".,?!:;" # 上面两个英文场景共用的源字符集合| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
smart_mode | 布尔 | — | false | 中文标点状态下的智能符号总开关(连按 → 换英文;数字后智能标点场景方向相反) |
smart_timeout_ms | 整数 | — | 500 | 连按两次的判定时限(毫秒) |
smart_chars | 字符串 | — | "。,?!:;、~¥·……——" | 参与智能符号转换的中文标点集合(子串包含匹配,含成对 / 多字符标点) |
smart_method | 枚举 | delete_replace / hold_composition | "delete_replace" | 替换方案:delete_replace = press1 直接提交中文符号、press2 删改,所见即所得、体感更好,但依赖对宿主做删改(部分 Chromium 应用光标偏移);hold_composition = press1 开启 TSF 组合态展示中文符号、press2 替换提交英文、超时后自动提交中文,全程不删改,兼容性更好 |
english_punct_mode | 布尔 | — | false | 中文输入模式 + 标点切到英文时的智能符号(连按 → 换中文)。用于「用英文标点写中文、偶尔要个中文句号」 |
english_mode | 布尔 | — | false | 英文输入模式下的智能符号(连按 → 换中文) |
english_chars | 字符串 | — | ".,?!:;" | 上面两个英文场景共用的源字符集合。存按键本身的 ASCII 标点(. 而非 。),与存中文产物的 smart_chars 不同 |
英文态智能符号 0.113 新增
english_punct_mode 与 english_mode 是 0.113 新增的两个开关,方向与 smart_mode 相反——连按英文标点换成中文的。拆成两个而不是一个,是因为场景不同:前者是「正文是中文、标点用英文,偶尔要个中文句号」,后者是「正在打英文」。多数人只需要前者,英文态保持纯净。
english_mode 的影响面更大
开启 english_mode 后,输入法会把 english_chars 里的键接管(原本英文半角下这些键直接透传给应用),不接管就到不了引擎。因此它默认关闭。
english_chars 里不建议放配对符((、[、{、"、' 等):英文模式下这些键被接管后配对改由引擎处理,而输入法 DLL 的跳出栈是空的,Tab 跳出会失效。
临时英文(input.temp_english)
Shift + 字母或触发键进入临时英文缓冲,输完自动上屏。
[input.temp_english]
enabled = true # 临时英文总开关
show_candidates = true # 显示英文候选
raw_candidate = true # 首候选恒是所打原文
case_variants = true # 生成大小写变形候选
case_follow_input = true # 候选跟随输入的大小写
commit_space = false # 上屏后自动加空格(临英自己那份)
shift_behavior = "temp_english" # Shift 键行为
trigger_keys = [] # 额外触发键(符号键进入临英)
allow_symbols = false # 临英缓冲内允许符号与数字(总开关)
symbol_chars = "0123456789+-_.@#/" # 放行哪些字符(白名单,逐字符)
space_as_input = false # 空格作为输入字符而非上屏
candidate_layout = "follow" # 候选窗布局(见本页「模式级候选布局」)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | true | 临时英文总开关 |
show_candidates | 布尔 | — | true | 显示英文候选 |
raw_candidate | 枚举 0.122 新增 | always / in_dict / off | "always" 0.119 新增 | 把所打原文作首候选。出厂 always = 保持一直以来的行为;三档语义见 schema.english 那份,两侧各自独立。⚠️ 本项为 off(或 in_dict 未命中)且下面的 case_variants 也关、词库又无命中时候选会是空的,此时空格上屏缓冲原文 |
case_variants | 布尔 | — | true | 是否在候选里补出全小写/首字母大写/全大写三种形态。它们各占一个候选位,只需要词库补全时可关闭 |
case_follow_input | 布尔 | — | true 0.121 新增 | 词库候选跟随你打的大小写,语义同 schema.english 那份。⚠️ 临英由 Shift + 字母 进入、缓冲首字母恒大写,开着它临英候选就恒为首字母大写形态;不想要这个观感把它关掉即可 |
commit_space | 布尔 | — | false 0.122 新增 | 临英选词上屏后补一个空格。与 schema.english 那份各自独立:长时打英文连着打词、补空格顺手;中文里插一个英文词,插完往往接中文或标点,补上的还得退格删掉。回车上屏不补 |
phrase_seg 0.122 新增 | 布尔 | — | false | 词组分词输入:用 ' 切开各段,每段只打前缀(ip'max → iPhone 15 Pro Max)。语义与 schema.english 那份完全一致,开关各一份。⚠️ 开启后 ' 在临英下不再是第三候选键,用数字键 3 代替 |
shift_behavior | 枚举 | temp_english / direct_commit | "temp_english" | Shift + 字母的行为:temp_english = 进入临时英文缓冲;direct_commit = 直接上屏该英文 |
trigger_keys | 字符串数组 | — | [] | 额外触发键(符号键进入临时英文模式,类似临时拼音触发键);默认空,仅 Shift + 字母触发 |
allow_symbols | 布尔 | — | false | 总开关:符号与数字是否直接进入临英缓冲,而非上屏退出或选词。放行哪些字符由 symbol_chars 决定 |
symbol_chars | 字符串 | — | "0123456789+-_.@#/" | 允许进入缓冲的字符白名单0.115 新增,逐字符字面匹配,不支持 a-z 这类范围写法。未列入的字符保持原有职责(详见临时英文的字符白名单)。留空则一个都不放行 |
space_as_input | 布尔 | — | false | 空格是否作为输入字符(而非触发上屏) |
candidate_layout | 枚举 | follow / vertical / horizontal | "follow" | 临英期间的候选窗排列方向,见模式级候选布局。英文候选一行放得下,全局竖排时常设 horizontal |
大写锁定(input.capslock)
[input.capslock]
cancel_on_mode_switch = false # 中英模式切换时取消大写锁定| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
cancel_on_mode_switch | 布尔 | — | false | 中英模式切换时是否同时取消 CapsLock 大写锁定状态 |
临时拼音(input.temp_pinyin)
码表方案下临时切到拼音反查。全局唯一。
[input.temp_pinyin]
enabled = true # 临时拼音总开关
trigger_keys = ["backtick"] # 引导键(默认反引号)
candidate_layout = "follow" # 候选窗布局(见本页「模式级候选布局」)
# hotkey = "" # 专用直达热键,预置文件未写,默认空(不注册)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | true | 临时拼音总开关 |
trigger_keys | 字符串数组 | — | ["backtick"] | 引导键(如 backtick / z / semicolon),默认反引号 |
hotkey | 字符串 | — | "" | 专用直达热键(如 "ctrl+shift+p",空串 = 不注册);与 trigger_keys 引导键共存,热键进入时组合区不写引导符。预置文件未写,默认空 |
candidate_layout | 枚举 | follow / vertical / horizontal | "follow" | 临拼期间的候选窗排列方向,见模式级候选布局 |
模式级候选布局
临时拼音、临时英文、网址输入、邮箱输入、快捷输入、引导键特殊模式、快捷加词,各有一个同名的 candidate_layout,语义完全一致:
| 取值 | 含义 |
|---|---|
follow | 跟随全局 ui.candidate.layout——你改全局,本模式跟着改 |
vertical | 进入本模式期间强制竖排,退出自动恢复 |
horizontal | 进入本模式期间强制横排,退出自动恢复 |
它不是布尔开关:follow 与 vertical 的区别只在全局本身是竖排时才显现——前者跟着全局变,后者恒定竖排。也正因如此,才能表达「全局竖排、但临时英文横排」这种组合(英文候选一行放得下,竖排反而占屏)。
各模式的键位置不同(末行的方案级不是模式,见表下说明):
| 模式 | 配置键 | 出厂默认 | 设置工具 |
|---|---|---|---|
| 临时拼音 | input.temp_pinyin.candidate_layout | follow | ✅ 下拉 |
| 临时英文 | input.temp_english.candidate_layout | follow | ✅ 下拉 |
| 快捷输入 | schema.mix_modes 中 quick_mix 的 candidate_layout | vertical | ✅ 下拉 |
| 网址输入 | input.url.candidate_layout | follow | ✅ 下拉 0.122 新增(开了历史补全才会出候选) |
| 邮箱输入 0.122 新增 | input.email.candidate_layout | follow | ✅ 下拉 |
| 特殊模式 | 方案文件 [overlay] 的 candidate_layout | follow | ✅ 下拉(方案设置 → 特殊模式),见引导键特殊模式 |
| 快捷加词 | input.add_word.candidate_layout | vertical | 仅配置文件 |
| 方案级 0.119 新增 | 方案文件 [candidate] 的 layout | follow | ✅ 下拉(方案设置 → 本方案行为),见方案级行为 |
快捷输入与特殊模式是每实例的——你配了多个融合模式或多个特殊模式时,每个各设各的,互不影响。
方案级与模式级的关系 0.119 新增
表格末行的方案级与其余各行有两点不同:
- 键名是
[candidate]段下的layout,不叫candidate_layout——它住在方案文件里,段名已经含了 candidate - 生效范围是「整个方案期间」,不是「进入 / 退出一个临时模式」。它没有「退出自动恢复」这回事,换方案才换
两者同时存在时模式级赢:在英文方案(竖排)里进临时拼音(横排),临拼期间就是横排,退出回到竖排。模式比方案更内层、更短暂,它对候选面的要求本就该压过你对整个方案的偏好;且模式一退出,方案级自动重新生效。
完整优先级从高到低:
快捷加词 > 上表前五行的任一模式 > 你在本方案期间手动改的值 > 方案级 > 全局 ui.candidate.layout「你手动改的值」指用菜单或快捷键切换横竖排——它在本次停留于该方案期间一直有效,切走再切回来重新按方案声明落地。
模式级注释模板
与上面的 candidate_layout 同一个思路:各模式可以覆盖候选注释的模板,
进入该模式期间生效,退出自动恢复。仅配置文件,无图形界面。
[input.temp_english]
comment_template_vertical = "${dict}" # 打英文时显示词典释义
comment_template_horizontal = "${dict}"
[input.temp_pinyin]
comment_template_vertical = "" # 临拼期间不显示注释
comment_template_horizontal = ""键名与全局的 ui.candidate.comment_template_vertical / _horizontal 一致,横竖各配各的,各自三态:
| 状态 | 含义 |
|---|---|
| 不写该键 | 跟随全局同方向的模板(默认) |
| 非空字符串 | 本模式期间改用它 |
空串 "" | 本模式期间不显示注释 |
「不写」与「写空串」是两回事——前者跟随全局,后者明确要求不显示。也因此这两个键
不会出现在出厂 data/config.toml 里:写进去就等于给了它一个值,而任何值都不等于「跟随」。
可用位置:config.toml 的 input.temp_english、input.temp_pinyin、input.url、
schema.mix_modes[](每实例独立),以及方案文件的 [overlay] 段(每方案独立,
见引导键特殊模式)。
快捷加词面板不支持——它走独立绘制路径,本就不渲染注释。
典型用法见候选注释 · 分模式设置。
快捷加词(input.add_word)
按加词热键(默认 Ctrl+=)弹出的加词面板,目前只有布局一项可配。
[input.add_word]
candidate_layout = "vertical" # 加词面板的候选窗布局| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
candidate_layout | 枚举 | follow / vertical / horizontal | "vertical" | 加词面板期间的候选窗排列方向。默认竖排——面板是「标题行 + 词行」两行提示,竖排更易读 |
自动配对(input.auto_pair)
输入左括号自动补右括号,输右括号智能跳过。
[input.auto_pair]
chinese = false # 中文标点配对开关
english = false # 英文标点配对开关
chinese_pairs = ["()", "【】", "{}", "《》", "〈〉"] # 中文配对表
english_pairs = ["()", "[]", "{}", "<>"] # 英文配对表
jump_out_keys = ["right_symbol"] # 跳出配对的按键
state_ttl_secs = 120 # 配对状态存活期(秒)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
chinese | 布尔 | — | false | 中文标点配对开关 |
english | 布尔 | — | false | 英文标点配对开关 |
chinese_pairs | 字符串数组 | — | ["()", "【】", "{}", "《》", "〈〉"] | 中文配对表,每项 2 字符 |
english_pairs | 字符串数组 | — | ["()", "[]", "{}", "<>"] | 英文配对表,每项 2 字符 |
jump_out_keys | 字符串数组 | right_symbol / tab / enter / space / escape | ["right_symbol"] | 跳出配对的按键,可多选。right_symbol = 右符号键本身(打 ) 跳出已插入的 ()),其余为键名。列表里没有就是没有,不做隐式补偿。对称配对(引号)永不参与右符号跳出,只能靠 tab / enter 跳出 |
state_ttl_secs | 整数 | — | 120 | 配对状态存活期(秒),从最后一次按键起算,持续输入不断刷新——把括号退格删掉很久之后,Tab 不该再被当成跳出键吃掉。失焦一律立即清空配对状态,不归本项管 |
Emoji 候选(input.emoji) 0.121 新增
打出词语后,把对应的 emoji 追加进候选列表(「开心」→ 😄)。按候选文字查表,与编码无关,所有方案通用——五笔、拼音、混输一视同仁,不必逐方案配置。词表随程序附带(data/emoji/,来自 rime-emoji),首次开启时在本机建立一次索引缓存。
关闭时连数据文件都不打开,未启用的用户为它付出的内存与启动开销为零。
[input.emoji]
enabled = false # 总开关
scope = "exact" # 适用范围:exact / all / off
show_as = "after" # 显示位置:after / tail
max_per_word = 3 # 一个词最多追加几个
max_hosts = 1 # 只为列表前 N 个候选追加
min_word_chars = 2 # 候选少于此字数时不追加
categories = false # 是否启用分类词表| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 总开关 |
scope | 枚举 | exact / all / off | "exact" | 适用范围。exact = 只为完整匹配的词追加;all = 前缀补全、子短语之类的候选也追加。出厂 exact:那些候选本身就是「猜」出来的,再挂一个 emoji 只会放大噪音 |
show_as | 枚举 | after / tail | "after" | 显示位置。after = 紧随对应词之后,其后候选的序号顺延;tail = 追加到常用候选之后,原有序号不变 |
max_per_word | 整数 | — | 3 | 一个词最多产出几个 emoji。对普通词表几乎不触发(平均 1.09 个/词),真正拦的是分类词表 |
max_hosts | 整数 | — | 1 | 只为候选列表的前 N 个候选做扩展。出厂 1(只扩首选)——这是把「候选序号漂移」控制住的主要手段 |
min_word_chars | 整数 | — | 2 | 宿主候选至少要有几个字才触发。出厂 2:单字(「一」→ 1️⃣)噪音最大且最没用 |
categories | 布尔 | — | false | 是否加载分类词表(「动物」→ 整组动物 emoji)。出厂关:干扰几乎全集中在这 166 条上;但它也是「我想找个动物表情」时唯一好用的入口,故做成独立开关 |
emoji 不参与词频学习
emoji 候选按表追加、位置由上面几项决定,选它不会改变任何词的排序。想让某个 emoji 常驻靠前,请用快捷输入或短语,而不是指望调频。
网址输入(input.url)
正常输入下打出完整前缀(如 http / www.)即进入网址输入模式,模式内自由输入网址字符(不触发上屏),空格或回车上屏。
[input.url]
enabled = false # 网址模式总开关
prefixes = ["www.", "http", "https", "ftp."] # 触发前缀
history_enabled = false # 记下上屏过的网址供下次补全
history_max = 200 # 历史条数上限
candidate_layout = "follow" # 候选窗布局| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 网址输入模式总开关 |
prefixes | 字符串数组 | — | ["www.", "http", "https", "ftp."] | 触发前缀(恰好匹配即进入网址模式) |
history_enabled 0.122 新增 | 布尔 | — | false | 把上屏过的网址记下来,下次打到一半给出补全候选,见网址与邮箱的补全 |
history_max 0.122 新增 | 整数 | — | 200 | 历史条数上限,超出时按「用得少、用得旧」裁掉。0 = 不限——但补全每按一键查一次库,条数无顶时逐键开销会随使用一直涨 |
candidate_layout | 枚举 | follow / vertical / horizontal | "follow" | 见模式级候选布局。history_enabled 关着时网址模式不产出候选,这一项也就无从显现 |
历史是独立的一档开关
网址模式本身只改输入行为,不产生任何持久数据;开了历史才开始把你打过的网址原文落盘。两者的隐私量级不同,所以没有合成一个开关。已记下的内容在「词库管理 → 输入补全」里逐条查看与清空。
邮箱输入(input.email) 0.122 新增
正常输入下缓冲非空时按 @ 即进入:abc + @ → 用户名 abc,候选给出后缀拼成的完整邮箱,空格或回车上屏。
[input.email]
enabled = false # 邮箱模式总开关
suffixes = ["qq.com", "163.com"] # 预置后缀(出厂 24 条,此处节略)
candidate_layout = "follow" # 候选窗布局| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 邮箱输入模式总开关 |
suffixes | 字符串数组 | — | 出厂 24 条常用后缀 | 候选里预置的邮箱后缀。存 @ 之后的部分(qq.com 而不是 @qq.com)。这是数组不是映射表,在设置里删干净就是真的空表,不会被出厂值合回来 |
candidate_layout | 枚举 | follow / vertical / horizontal | "follow" | 见模式级候选布局 |
与网址模式的差别在触发判据:那边是「已打的字恰好等于某个前缀」,这边是「本键是 @ 且前面已经打了字」。空缓冲按 @ 不会进入,@ 照常作标点上屏——否则每次想单独打一个 @ 都会掉进模式里;这个条件同时也是「用户名从哪来」的答案。
模式内可自由输入表外的后缀,上屏后会被学下来,下次自动出现在候选里,并按使用次数排到预置项前面。后缀学习跟随 enabled,没有网址历史那道单独的开关——它只记域名,不记用户名。
网址与邮箱的补全 0.122 新增
两个模式共用同一套候选逻辑:
| 规则 | |
|---|---|
| 候选来源 | 你用过的网址 / 邮箱后缀(学习数据)+ 邮箱的预置后缀 |
| 排序 | 学过的一律排在预置后缀之前,其内部按「用得多 → 用得新」排;冷启动没有学习数据时,邮箱就是 suffixes 的书写顺序 |
| 条数 | 最多 30 条 |
| 空格 | 有候选就选候选,没候选才上屏原文 |
| 数字键 | 在这两个模式里是字符不是选词序号——否则打不出 163.com 和 abc123@qq.com |
| 上屏后 | 网址记原文(需 history_enabled),邮箱记 @ 之后的后缀 |
学到的东西落在一张全局表里,与方案无关,换方案照样补得出来;查看、搜索与清空在「词库管理 → 输入补全」,两类数据各有各的清空按钮。它们也已纳入整机备份,换机器不必重新攒。
Unicode 输入(input.unicode) 0.121 新增
正常输入下打出 u+,续打十六进制码点即得到该字符(u+4e00 → 一),空格或回车上屏。与上面的网址输入同属前缀夺取式模式:打出前缀那一刻就接管后续按键,不经过词库查询。
[input.unicode]
enabled = false # 总开关
prefixes = ["u+", "U+"] # 触发前缀
candidate_layout = "follow" # 候选窗布局| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 总开关 |
prefixes | 字符串数组 | — | ["u+", "U+"] | 触发前缀(恰好匹配即进入)。按字面匹配,区分大小写——这是与 input.url 的刻意差异:U+ 是 Unicode 的标准写法,大小写在这里携带真实信息 |
candidate_layout | 枚举 | follow / vertical / horizontal | "follow" | 见模式级候选布局。与网址那项不同,本项有实际效果——码点输入会实实在在出一条候选 |
出厂两条前缀各走一个入口,两者共用这一张表:小写 u+ 由码表缓冲触发;大写 U+ 因 Shift+U 会先被临时英文接管,由临时英文转交进来。关掉临时英文不影响 U+——那时大写字母落普通输入、缓冲里是小写 u,仍由 u+ 那条命中。
无效码点不出候选,此时按空格上屏的是你打的原文。候选的注释里给出该码点所属的 Unicode 区块名,与候选右键菜单的「类型」列同源。
不要配单字符前缀
写成小写 "u" 会夺取一切 u 起手的输入,废掉码表的 u 码元与拼音的 u;写成大写 "U" 则在空缓冲时被临时英文先截走,根本够不着夺取点。前缀至少两个字符。
简入繁出(input.s2t)
上屏时把简体候选转成繁体(简繁变换在上屏出口进行,引擎内部始终按简体处理)。
[input.s2t]
enabled = false # 简入繁出总开关
variant = "s2t" # 繁体变体| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 简入繁出总开关 |
variant | 枚举 | s2t / s2tw / s2twp / s2hk | "s2t" | 繁体变体:s2t = 标准繁体;s2tw = 台湾正体;s2twp = 台湾正体 + 常用词转换;s2hk = 香港繁体。另接受别名 tw/taiwan、twp、hk/hongkong;未识别值回退 s2t |
繁入简出(input.t2s) 0.121 新增
反方向的那一档:词库和候选本身是繁体,上屏时转成简体。给「平时打繁体、词库也是繁体,但这一份文档要出简体」的用户。
[input.t2s]
enabled = false # 繁入简出总开关| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 繁入简出总开关。只有标准一档,没有 variant——台/港归一需要官方没有的反转表 |
与简入繁出互斥
input.s2t 与 input.t2s 只能开一个,开这个会自动把那个关掉(并落盘,不是只改内存)。内部候选域只有一个,两个方向同时开等于先转过去再转回来,产物是绕了一圈的近似原文——繁体简体都拿不到。设置页的两个开关也做了互斥。
开关键是 keys.toggle_t2s,出厂 "none"(不绑)。工具栏另有一格 t2s,出厂不显示(见 ui.langbar.items),常态显「简」、亮起表示正在转换。状态气泡显示的是「繁→简」而不是单字。
命令栏(input.cmdbar)
$CC / $SS / $AA 等命令候选(带副作用的命令直接从候选框执行)。
[input.cmdbar]
enabled = false # 命令栏总开关
candidate_prefix = "⚡" # 命令候选前缀标注| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | false | 命令栏总开关 |
candidate_prefix | 字符串 | — | "⚡" | 副作用命令候选在候选框渲染时的前缀标注 |
短语(input.phrase)
短语前缀列举(含命令栏 $CC/$SS/$AA)。
[input.phrase]
min_prefix = 2 # 触发前缀导航列举的最小输入长度| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
min_prefix | 整数 | — | 2 | 触发前缀导航列举的最小输入长度 |
取坐标用的占位组合区(input.caret) 0.122 新增
造词、临时拼音、引导键特殊模式、生僻字这四个模式由热键直接进入,进入那一瞬间还没有任何输入内容,却要立刻显示候选窗或预览窗。为了问出「候选窗该画在哪」,输入法会先发一个只含空格的占位组合区,把取坐标用的范围撑开。
代价是:你选中着文字再按这些热键时,选中的内容会被那个空格替换掉(造词 Ctrl+= 最常撞上)。这是 TSF 的标准语义,不是某个程序的怪癖。
[input.caret]
add_word_via_composition = false # 造词:出厂就走了这个出口
temp_pinyin_via_composition = true # 临时拼音
special_via_composition = true # 引导键特殊模式
rare_char_via_composition = true # 生僻字| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
add_word_via_composition | 布尔 | false | 造词面板 |
temp_pinyin_via_composition | 布尔 | true | 临时拼音 |
special_via_composition | 布尔 | true | 引导键特殊模式 |
rare_char_via_composition | 布尔 | true | 生僻字模式 |
| 取值 | 取坐标 | 选中的文字 |
|---|---|---|
true | 用占位组合区,最准 | 会被吃掉 |
false | 退到回退链(窗口线程信息 → 系统插入点 → 上次已知位置 → 窗口中心估计) | 原样保留 |
为什么不干脆四个都关
很多程序的 Win32 取坐标接口给不出正确坐标,只有基于组合区的那条准,占位空格正是为兼容它们而存在。一律关掉是拿「吃字」换「候选窗错位」——错位影响的是所有人的日常输入,吃字只在「选中着文字又去按热键」时才发生。所以做成逐模式开关,按你自己的程序实测逐个调。
出厂只关造词:它弹的是预览窗,对坐标精度的敏感度低于候选列表,实测关掉后位置仍然正确。另三个弹的是候选列表,错位的观感与代价更大。
只对直达热键那条进入方式生效。用引导键(`、z 等)进入时组合区里有真实内容(引导符),那时的组合区是显示所必需的,与「为取坐标插一个占位」不是一回事,本段不参与。
相关阅读
对这篇文档有疑问,或发现内容有误?
欢迎到文档仓库提 issue,写明问题时附上本页链接即可。