外观配置
ui 域全部配置项——候选窗、编码与翻页、悬停提示、状态气泡、工具栏、字体主题
[ui] 域控制输入法的外观行为与布局:候选窗排布、编码显示方式、翻页、悬停提示、状态气泡、工具栏,以及字体与主题的选择。
注意区分职责:纯视觉样式(颜色、圆角、透明度、字号基线、边距等)由主题决定,见外观与主题;本页配置的是行为与布局(显示什么、怎么排、放哪里)。二者交汇处(如候选字号、翻页栏显隐)本页字段可覆盖主题基线。
默认值来源
本页默认值以系统预置 data/config.toml 的 [ui] 段为准。部分字段的程序内置缺省与预置值不同(例如加载缺失该键的旧配置时按内置缺省回退),本页以预置值为准。
候选窗——基本(ui.candidate)
[ui.candidate]
font_size = 0 # 候选文本字号(0 = 跟随主题)
per_page = 7 # 每页候选数
per_page_extended = 0 # 扩展档每页候选数
max_chars = 16 # 候选文本最大显示字数
layout = "horizontal" # 候选排布方向
hide_window = false # 隐藏候选窗
double_click_screenshot = false # 双击候选窗空白处截图到剪贴板
index_labels = [] # 自定义序号标签
comment_template_vertical = "${code_hint|code_rev|shuangpin}" # 竖排候选注释模板
comment_template_horizontal = "${code_hint|code_rev|shuangpin}" # 横排候选注释模板
comment_max_chars_vertical = 0 # 竖排候选注释最大字数
comment_max_chars_horizontal = 0 # 横排候选注释最大字数
comment_above = false # 注释首行(模板里第一个 \n 之前)显示在候选上方| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
font_size | 浮点 | — | 0 | 候选文本字号:0 = 跟随主题 behavior.font_size;大于 0 = 自定字号,覆盖主题。0.123 新增 起旧的 font_size_follow_theme 开关已并入本项,升级时自动迁移(开着跟随 → 0;关了跟随 → 保留原字号)并从配置文件中移除 |
per_page | 整数 | — | 7 | 每页显示的候选数 |
per_page_extended | 整数 | — | 0 | 扩展档(临拼 / 快捷 / 短语等 overlay 模式)每页候选数;0 = 与 per_page 相同 |
max_chars | 整数 | — | 16 | 候选文本最大显示字数,超出截断并加省略号(0 = 不限);仅影响显示,上屏用完整原文 |
layout | 枚举 | horizontal / vertical | "horizontal" | 候选排布方向:横排 / 竖排 |
hide_window | 布尔 | — | false | 隐藏候选窗(不显示候选列表) |
double_click_screenshot 0.123 新增 | 布尔 | — | false | 双击候选窗的编码栏或空白处,把候选窗当前画面复制到剪贴板(与右键菜单「截图到剪贴板」同一效果)。候选词与翻页键按下即生效,不参与双击判定;双击间隔与位移容差跟随系统鼠标设置。仅 Windows |
index_labels | 字符串数组 0.117 新增 | — | [] | 自定义序号标签,一槽一项(如 ["a","s","d"]、["Ⅰ","Ⅱ","Ⅲ"])。每项是一个完整标签,可含多个字符;空表 = 默认 1–9。槽内空串或槽位不足处让位主题 index.labels,主题也未定义才回退数字 |
comment_template_vertical | 字符串 | — | "${code_hint|code_rev|shuangpin}" | 竖排候选注释(候选右侧的小字)模板。语法与变量见候选注释;留空 = 不显示 |
comment_template_horizontal | 字符串 | — | "${code_hint|code_rev|shuangpin}" | 横排候选注释模板。横排宽度由全部候选共享,放注音/字根易撑宽窗口 |
comment_max_chars_vertical | 整数 0.119 新增 | — | 0 | 竖排候选注释最大字数,超出截断并加省略号(0 = 不限)。竖排每行独占,通常可比横排放宽。开启 comment_above 后按上下两段各自计算 |
comment_max_chars_horizontal | 整数 0.119 新增 | — | 0 | 横排候选注释最大字数。开启 comment_above 后按上下两段各自计算 |
comment_above | 布尔 0.124 新增 | — | false | 注释首行显示在候选上方:模板里字面写的第一个 \n 把注释拆成两段,上段在候选上方一行,下段仍在右侧;变量值自带的换行不算。写法约束与版面见注释显示在候选上方;上方条样式见主题的 [comment_above] 节点。设置位置:外观 → 候选标注 → 候选注释 → 设置 |
auto_comment_dicts | 布尔 0.121 新增 | — | true | 词库在 columns 中声明 comment 列时,自动将该列作为 ${dict} 的注释源。判据是显式声明;import_tables 引入的子表逐一检测。识别结果在注释词库列表中标「自动」 |
注释词库(ui.comment_dicts) 0.114 新增
供注释模板 ${dict} 变量查询的独立注释词库列表(如英汉释义、Emoji 名称)。ui.comment_dicts 是结构体数组(TOML 的 [[ui.comment_dicts]] 形态),出厂为空——词典多有版权,不随附任何内容,由用户自行放置。设置页入口在外观 → 候选标注 → 注释词库,也可直接写配置:
[[ui.comment_dicts]]
id = "emoji" # 稳定标识(日志 / 设置页定位用)
label = "Emoji 名称" # 显示名
path = "comments/emoji.dict.yaml" # 相对 schemas/;用户目录优先,回落安装目录
enabled = true # 是否启用,省略视为启用
schemas = [] # 限定生效方案 id;留空 = 全部方案数组顺序即优先级(同一个词多库都有注释时取靠前的);schemas 用来避免无谓开销——一份大英汉词典写 schemas = ["english"] 后,中文方案下根本不加载。词库文件格式与完整挂载说明见候选注释。
词库自带注释的记录 0.121 新增
ui.candidate.auto_comment_dicts 识别出的条目也记在本表中。这类记录只含三个字段,用于保存它的启停状态与优先级:
[[ui.comment_dicts]]
id = "auto:pinyin/cn_dicts/corrections.dict.yaml" # 由词库路径生成
auto = true # 标记为自动识别的记录
enabled = false # 启停状态path 与 schemas 不写入——两者每次启动重新检测,写入即成为过时快照。未在本表中出现的自动条目按检测顺序排在末尾并默认启用;id 匹配不到词库时(词库已删除或停用)该记录静默忽略。
候选窗——尺寸稳定(ui.candidate) 0.118 新增
候选窗默认完全跟随内容缩放:单字候选与多字候选间来回切换时宽度跳动,候选数变化、翻页栏或编码栏的出现消失又让高度跟着伸缩,连续输入时观感抖动明显。五个下限项用来锁住尺寸,出厂均为 0(关闭)。
min_window_width_horizontal = 0 # 横排时窗口最小宽度(dp),0 = 关闭
min_window_width_vertical = 0 # 竖排时窗口最小宽度(dp),0 = 关闭
min_window_height_horizontal = 0 # 横排时窗口最小高度(dp),0 = 关闭
min_window_height_vertical = 0 # 竖排时窗口最小高度(dp),0 = 关闭
min_rows = 0 # 竖排候选区最小行数,0 = 关闭| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
min_window_width_horizontal | 整数 | — | 0 | 横排时候选窗的最小宽度,单位 dp(逻辑像素);0 = 关闭,宽度跟随内容。超出下限后宽度照常跟随内容,不封顶 |
min_window_width_vertical | 整数 | — | 0 | 竖排时候选窗的最小宽度,语义与横排那项一致。与主题的竖排宽度上限(behavior.vertical_max_width)冲突时下限优先 |
min_window_height_horizontal | 整数 | — | 0 | 横排时候选窗的最小高度(dp)。横排候选虽只有一行,窗口高度仍会随编码栏出现/消失而变 |
min_window_height_vertical | 整数 | — | 0 | 竖排时候选窗的最小高度(dp)。翻页栏、编码栏的出现消失一并吸收 |
min_rows | 整数 | — | 0 | 竖排候选区的最小行数;0 = 关闭,高度跟随候选数。候选不足时补等高的透明空行。生效值自动钳到 per_page(补出比一页还多的空行只会得到大半空白的窗口)。横排不适用(候选并列于一行,高度本就恒定) |
下限量的是整个窗口,不是单个候选。 候选照常按内容紧凑排列并左对齐,凑不满的部分留在窗口右侧 / 底部空着:横排配 100、而首两个候选各占 30dp 与 20dp 时,两者仍按原本方式并排,右侧空着。翻页栏、编码栏、各级内边距一并计入,所以「窗口大小不变」是可以直接达成的。
窗口被翻到光标上方显示时,高度富余补在顶部——上方显示时底边贴光标,空白压在下面会把候选整体顶离光标,位置反而随内容抖动。竖排下候选行的高亮背景跟随窗口铺满,行内的序号 / 文字 / 注释仍按内容左对齐。
min_window_width_* 与 max_chars(候选文本最大字数)成对:一个封窗口下限、一个封文字上限,两个都配上候选窗宽度就基本固定。
- 即使
max_chars = 0(不限),候选窗也不会撑出显示器边界 0.118 新增——放不下的文字按像素截断并加省略号,横排多个候选按可用宽度公平分配(短候选保留原样,余量让给长候选)
min_rows 与 min_window_height_vertical 是两种量法,可同时配、取两者较大者:前者只稳住候选区(翻页栏照常伸缩),后者罩住整个窗口。
单位取 dp 而非字符数:本组量的是窗口而不是文字,窗口尺寸里还有序号列、各级内边距、翻页栏等与字号无关的部分,用字符数换算不出来。dp 随 DPI 自动缩放,高分屏上等比放大。
候选窗——编码显示(ui.candidate)
preedit_display = "app_inline" # 编码(组合区)显示方式| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
preedit_display | 枚举 | app_inline / candidate_top / candidate_inline | "app_inline" | 编码(组合区)显示方式,取代旧的 inline_preedit + preedit_mode 组合 |
三个取值的含义:
app_inline(默认):编码内嵌应用光标处,候选窗不显示 preedit 栏。candidate_top:候选窗顶部独立 preedit 栏。candidate_inline:编码作为候选窗首单元内联。
后两种把编码的显示托付给候选窗,而候选窗在宿主自绘候选的场合根本不弹——走 TSF UI-less
的全屏游戏(SDL、Unreal 等引擎)、D3D 独占全屏,都属于这一类:候选窗弹出去会把游戏踢出独占
全屏,轻则闪黑、重则崩溃。这种场合下本项自动按 app_inline 走,把编码写回应用的组合区,
否则编码两条出口全断,一个字都看不见。设置里选的值不变,只是在这些宿主里按内嵌呈现。
候选窗——上翻行为(ui.candidate)
候选窗被顶到光标上方时的两个正交开关,可单独或叠加。
flip_when_above = false # 上翻时反转候选排列顺序(仅竖排)
swap_preedit_when_above = false # 上翻时交换编码栏与候选栏位置| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
flip_when_above | 布尔 | — | false | 候选窗在光标上方时反转候选项排列顺序。仅 layout = "vertical"(竖排)生效:横排候选左右并列,反转与窗口在上在下无关,故忽略。反转期间上下条目键(↑↓ 与 Shift+Tab、Tab)按屏幕上看到的方向走;翻页键不受影响 |
swap_preedit_when_above | 布尔 | — | false | 候选窗在光标上方时交换编码栏与候选栏位置(编码区沉底贴光标);与 flip_when_above 正交,可叠加 |
候选窗——翻页栏(ui.candidate)
pager_bar_display = "" # 翻页栏显示覆盖
page_number_display = "" # 页码文字显示覆盖
pager_in_preedit = false # 翻页栏并入编码栏行| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
pager_bar_display | 枚举 | "" / hide / auto / always | "" | 翻页栏显示覆盖:"" = 跟随主题;hide = 不显示;auto = 超过 1 页才显示;always = 始终显示 |
page_number_display | 枚举 | "" / show / hide | "" | 页码文字显示覆盖:"" = 跟随主题;show = 显示;hide = 隐藏 |
pager_in_preedit | 布尔 | — | false | 翻页栏并入编码所在行、右对齐显示(竖排省一行)。两种编码形态落点不同、表现一致:candidate_top 并进独立编码栏行的右端,candidate_inline 0.122 新增 并进编码自己那一行。横排下翻页栏本就落在行尾,此项无影响;蒙古文等旋转排版维持底部独立行 |
候选窗——定位(ui.candidate)
position_mode = "follow_caret" # 候选窗定位方式
offset_x = 0 # 跟随光标时的水平微调(dp,正=右)
offset_y = 0 # 跟随光标时的垂直微调(dp,正=远离光标)
shadow = "follow" # 主题阴影:follow 跟随主题 / off 关闭
custom_x = 0 # 固定模式内容左上 X(拖动落盘)
custom_y = 0 # 固定模式内容左上 Y(拖动落盘)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
position_mode | 枚举 | follow_caret / fixed | "follow_caret" | 候选窗定位方式:follow_caret = 跟随光标(默认);fixed = 固定屏幕坐标,不再随光标移动、也不再上翻(flip / swap_when_above 随之失效) |
offset_x / offset_y | 整数 | −400 ~ 400 | 0 | 跟随光标时在主题自带定位之上的用户微调(dp),与主题的 position_offset 相加。X 正值向右;Y 正值恒为「远离光标」——候选窗在下方时向下推、翻到上方时向上推。固定位置与拖动不受影响 |
shadow | 枚举 | follow / off | "follow" | 主题阴影覆盖。off 时不画阴影,候选窗与内容等大,阴影带来的定位补偿随之归零;主题自带的位置偏移仍保留。用于个别应用里透明边引起的兼容问题。仅 Windows(macOS 用系统原生阴影) |
custom_x | 整数 | — | 0 | 固定模式下内容左上屏幕 X(不含阴影扩边) |
custom_y | 整数 | — | 0 | 固定模式下内容左上屏幕 Y(不含阴影扩边) |
程序维护项:candidate.custom_x / custom_y
ui.candidate.custom_x / custom_y 仅 position_mode = "fixed" 时生效,且由用户拖动候选窗时自动落盘,设置工具刻意不暴露:手填绝对坐标既不直观、又会与拖动互相覆盖。(0, 0) 视作"尚未设定",首次显示落到屏幕默认锚点。
首显调优(隐藏项)
三个用于微调「候选窗何时显示」的内部选项,不在设置页,一般无需改动:
first_show_settle_ratio = 0.8 # 非权威坐标与权威坐标的容差(行高倍数)
fast_typing_window_ms = 100 # 连续输入判定窗口
fast_first_show_fallback_ms = 25 # fast 档等不到坐标时的兜底超时| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
first_show_settle_ratio | 小数 | 0.8 | 首显用过非权威坐标时,权威坐标与它相差在「行高 × 本值」以内就不再校正——校正动作本身才是抖动的观感来源 |
fast_typing_window_ms | 整数 | 100 | 两次按键间隔小于此值即视为连续输入,fast 档直接采信首条试探坐标。0 = 关闭该快路径 |
fast_first_show_fallback_ms | 整数 | 25 | fast 档等不到坐标时的兜底超时。不发 OnLayoutChange 的宿主(如 Word)靠它退化成 instant 而非干等 |
首显策略本身(fast / wait / instant)是逐应用规则,写在 compat.toml 而非这里,见应用兼容性规则。
字体(ui.font)
[ui.font]
family = "" # 字体族名
weight = 0 # 字重(0 = 不指定)
fallback = [] # 缺字时按序接续的回退字体
scripts = {} # 按文字类别单独指派字体
path = "" # 字体文件路径
render_mode = "directwrite" # 文本渲染后端| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
family | 字符串 | — | "" | 候选窗字体族名。填了就作用于候选窗全部文字(候选、序号、编码栏、注释、翻页栏),覆盖主题各节点配的字体;留空 = 跟随主题,主题也没配时用内置默认字体。唯一更优先的是方案里的候选文字字体,它只管候选词本身 |
weight | 整数 0.123 新增 | 0 / 100–950 | 0 | 候选窗文字的字重(400 常规、500 中等、600 半粗、700 粗)。0 = 不指定:常规,或跟随主题。字体没有该字重时取最接近的。非 0 时它是候选窗文字的基准:主题里的普通字重(低于 600)改用它,主题刻意加粗的地方(600 及以上,或比基态更粗,如选中项 700)取两者中更粗的——用户字重低于主题强调值时,强调仍比普通粗。作用范围是候选窗全部文字(候选、序号、注释、编码栏、翻页栏、模式标签);功能菜单、悬停提示、状态气泡与通知由各自的窗口绘制,不受它影响 |
fallback | 字符串数组 0.120 新增 | — | [] | family 里缺某个字时,按顺序往后找的字体。最终链 = [family] + fallback |
scripts | 表 0.120 新增 | — | {} | 按文字类别单独指派字体,键取 latin / greek / cyrillic / cjk / emoji / digits / punct,值是该类自己的字体链。见回退链与按类别指派 |
path | 字符串 | — | "" | 字体文件路径(加载非系统安装的字体文件时使用);留空 = 按 family 从系统查找 |
render_mode | 枚举 | directwrite / gdi | "directwrite" | 文本渲染后端:directwrite(默认,抗锯齿更佳)/ gdi(兼容旧渲染) |
字体名写家族名,字重单独设 0.123 新增
family、fallback、scripts、方案与主题里的 font_family 填的都是字体的家族名
(如「思源宋体」),不含字重;粗细用 weight 单独设。
早先设置界面的字体列表里有「思源宋体 SemiBold」「霞鹜文楷 Medium」这类带字重的名字,
选了会静默回落成默认字体。现在这类旧名仍然认:会拆成家族「思源宋体」+ 字重 600 生效
(weight 非 0 时以 weight 为准),日志里留一条说明。在设置界面重新选一次字体和字重即可换成新写法。
回退链与按类别指派 0.120 新增
两者回答的是不同的问题,可以同时用:
fallback答「这个字谁都没有怎么办」——只有主字体缺字才轮到它,按顺序找到第一个有的为止。scripts答「这一类字就该用它」——不管主字体有没有,该类文字直接用指定的字体。
[ui.font]
family = "微软雅黑"
fallback = ["Segoe UI Emoji"] # 雅黑没有的字,去这里找
[ui.font.scripts]
latin = ["Cascadia Code"] # 拉丁字母一律用等宽,不管雅黑有没有一句中英混排是按类别切段排版的,不是逐字换字体:空格、标点、组合记号这类中性字符 继承上下文——否则一句话会被切成十几段,段与段的边界还会丢掉字距。
类别名写错不报错,只是被忽略(日志里留一条 warn)。设置界面的「按文字类别指定字体」 会把七个类别预填好,在现成的行上改比手写安全,见外观设置 · 字体。
主题(ui.theme)
[ui.theme]
name = "default" # 主题名
style = "system" # 明暗风格| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
name | 字符串 | — | "default" | 当前主题名(对应主题包 / 主题目录) |
style | 字符串(隐性枚举) | system / light / dark | "system" | 明暗风格:system = 跟随系统;light = 浅色;dark = 深色 |
主题的具体样式定义(配色、圆角、字号基线等)见外观与主题。
模式指示(ui.mode_indicator)
进入临时拼音 / 双拼 / 快捷 / 英文 / 快符等模式时的标识。
[ui.mode_indicator]
style = "short" # 模式标识样式| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
style | 枚举 | short / full / none | "short" | 模式标识样式:short = 短称(拼 / 双 / 快 / 英 / 符);full = 全称(如"临时拼音");none = 不显示 |
状态气泡(ui.status)
中英 / 标点 / 全半角 / 简繁 / 大写锁定等状态切换时的瞬时提示气泡。样式(字号 / 透明度 / 圆角 / 配色)跟随主题(theme.views.status),此处为行为与位置。
[ui.status]
enabled = true # 是否启用状态气泡
duration = 800 # 自动隐藏时长(毫秒)
display_mode = "temp" # 显示模式
show_on_focus = false # 切换输入框时也提示一次
schema_name_style = "full" # 方案名显示样式
position_mode = "follow_caret" # 位置模式
offset_x = 0 # follow_caret 水平偏移
offset_y = 0 # follow_caret 垂直偏移
custom_x = 0 # fixed 固定 X(拖动落盘)
custom_y = 0 # fixed 固定 Y(拖动落盘)
items = ["schema", "punct", "full_width", "s2t", "caps"] # 显示哪些内容段| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | true | 是否启用状态提示气泡(false = 完全不显示) |
duration | 整数 | — | 800 | 自动隐藏时长(毫秒);display_mode = "always" 时忽略 |
display_mode | 枚举 | temp / always | "temp" | 显示模式:temp = 临时(duration 后隐藏,默认);always = 常驻(激活 / 获焦时显示,失焦隐藏) |
show_on_focus | 布尔 | — | false | 切换到别的输入框时也提示一次当前状态。仅 display_mode = "temp" 下有意义(always 本就在获焦时显示)。跟随光标定位下取不到精确插入点的应用不显示,详见下方说明 |
schema_name_style | 枚举 | full / short | "full" | 方案名显示样式:full = 全名(默认);short = 图标短称(icon_label,无则回退全名) |
position_mode | 枚举 | follow_caret / fixed | "follow_caret" | 位置模式:follow_caret = 跟随光标(默认);fixed = 固定屏幕坐标(custom_x / custom_y) |
position_mode 的锚点取值 0.123 新增 | 枚举 | 7 个锚点,见下文 | —— | 气泡固定在屏幕或当前窗口的某个位置,不读光标 |
fallback_position 0.123 新增 | 枚举 | last / hide / 7 个锚点 | "last" | 跟随光标时,程序报不出光标位置的那一次气泡放哪:last = 上次拿到光标的位置(默认,即以前的行为);hide = 不显示;锚点见下文。只在 position_mode = "follow_caret" 时生效 |
offset_x | 整数 | — | 0 | follow_caret 下相对默认位置(光标下方居中)的水平偏移(像素,正 = 右) |
offset_y | 整数 | — | 0 | follow_caret 下相对默认位置的垂直偏移(像素,正 = 下) |
custom_x | 整数 | — | 0 | fixed 模式的固定屏幕 X(像素) |
custom_y | 整数 | — | 0 | fixed 模式的固定屏幕 Y(像素) |
items | 字符串数组 | schema / punct / full_width / s2t / caps | ["schema", "punct", "full_width", "s2t", "caps"] | 气泡显示哪些内容段;留空 = 全部显示。可选项:schema(输入方案 / 中英)、punct(标点状态)、full_width(全半角)、s2t(简繁)、caps(大写锁定)。列表顺序无关,渲染顺序固定 |
程序维护项:status.custom_x / custom_y
ui.status.custom_x / custom_y 仅 position_mode = "fixed" 时生效,由用户拖动气泡时自动落盘,设置工具刻意不暴露(与 ui.candidate.custom_x/y 同一决策)。日常调整位置请用 offset_x / offset_y。
show_on_focus 在部分应用里不显示,是刻意的
刚切换到一个输入框、还没开始打字时,输入法未必能从应用那里问到精确的插入点位置——某些应用要等第一次输入之后才提供。此时若退而求其次用系统光标,拿到的可能是别的窗口残留的位置,气泡就会飘到无关的地方(在 Word 的标题行上实测偏差可达 800 多像素)。
因此跟随光标定位下只在拿到精确位置时才显示:宁可不提示,也不提示在错的地方。绝大多数应用能在毫秒级内给出位置,正常都会显示。
如果你所用的应用始终不显示、又确实想要这个提示,把 position_mode 改成 fixed(或右键气泡勾选「固定位置」)——固定位置不依赖光标,任何应用下都会显示。
- 也可以保持跟随光标,把
fallback_position设成某个锚点:等不到光标位置时,约 0.15 秒后在锚点上显示 0.123 新增
锚点定位与兜底位置 0.123 新增
position_mode 与 fallback_position 共用下面 7 个锚点:
| 取值 | 位置 |
|---|---|
screen_center | 屏幕中央 |
screen_top_left / screen_top_right | 屏幕左上角 / 右上角 |
screen_bottom_left / screen_bottom_right | 屏幕左下角 / 右下角 |
window_center | 窗口中央 |
window_bottom_left | 窗口左下角 |
「屏幕」指当前窗口所在的那块显示器、避开任务栏后的区域;「窗口」指当前窗口的可见边框(不含阴影)。角上的锚点离边缘留一小段距离,窗口最小化时窗口锚点按同位置的屏幕锚点处理。macOS 上拿不到宿主窗口的边框,两个窗口锚点分别按 screen_center / screen_bottom_left 处理,「屏幕」取鼠标所在的那块。
[ui.status]
position_mode = "follow_caret"
fallback_position = "screen_bottom_right" # 报不出光标位置时,显示在屏幕右下角position_mode设成锚点:气泡始终在那里,不读光标,任何程序里都会显示fallback_position:平时照常跟随光标,只在某一次拿不到可信的光标位置时才启用。设计软件等报不出光标的程序,默认的last会让气泡停在上一次的位置(可能是别的程序里);hide干脆不显示- 两个键写错都回落出厂默认(
follow_caret/last) - 两者都能按应用单独覆盖:见应用兼容性规则 · 状态提示位置,或在该程序里用功能主菜单 → 应用独立配置 → 状态提示位置
悬停提示(ui.tooltip)
鼠标悬停候选时弹出的提示。
[ui.tooltip]
delay = 200 # 悬停多久后显示(毫秒)
max_chars = 200 # 单行最多显示多少字(0 = 不限)
wrap_width = 40 # 折行宽度,按列计(0 = 不折行)
[[ui.tooltip.sections]]
label = "完整原文"
template = "${full_text}" # 仅候选被截断时有值
[[ui.tooltip.sections]]
label = "编码{(${code_source})}"
template = "${word_code}"
[[ui.tooltip.sections]]
label = "拼音"
each = "han"
template = "${char}:${readings}"
[[ui.tooltip.sections]]
enabled = false
label = "拆字"
each = "han"
template = "${char}:${chaizi}{ [${chaizi_code}]}"
[[ui.tooltip.sections]]
enabled = false
label = "Unicode"
each = "char"
template = "${char}:${unicode}"
[[ui.tooltip.sections]]
enabled = false
label = "调试"
template = "${debug}"| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
delay | 整数 | — | 200 | 提示延迟显示时间(毫秒) |
max_chars 0.123 新增 | 整数 | 0 = 不限 | 200 | 每行最多显示多少字(按字素簇计,emoji 组合算一个),超出截断加 …。只影响显示,右键复制 / 上屏取完整原文 |
wrap_width 0.123 新增 | 整数 | 0 = 不折行 | 40 | 折行宽度,按显示列计:汉字、全角字符、emoji 计 2,其余计 1。英文 / 编码串优先在空格、/、· 后断开;模板字面含制表符的段,带制表符的行不折 |
sections 0.123 新增 | 结构体数组 | 字段见下表 | 出厂六段,见上方代码块 | 气泡的段,数组顺序即自上而下的显示顺序。整表覆盖:用户配置里写了就整张取代出厂列表,不逐段合并 |
段字段(ui.tooltip.sections) 0.123 新增
| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | true | 段开关;关着的段保留在列表里 |
label | 字符串(模板) | — | "" | 段名,显示为 [段名] 独占一行;空 = 无标题行。本身也是模板,但其中的字面文字不随变量为空而消失:编码{(${code_source})} 直接输入时显示 编码 |
template | 字符串(模板) | — | "" | 段内容。结果按换行拆行、空行丢弃;全空则整段不显示 |
each | 字符串(隐性枚举) | "" / han / char | "" | 求值粒度:"" 整个候选一次;han 对显示文本中每个码位 ≥ U+3400 的字(汉字)各一次;char 对每个非空白字符各一次。逐字时每字一行,${char} 不计入「这行有值」。未知值按 "" 处理并记警告 |
promote | 字符串(变量名) | — | "" | 仅逐字段:该变量有值的行稳定排到前面,两组内部保持原文顺序;空 = 按原文顺序 |
inline | 布尔 | — | false | 内容恰为一行且段名非空时,写成 段名: 内容,不单独占一行标题 |
气泡专属变量:${full_text}(候选显示被截断时的完整原文,未截断为空)、${word_code}(编码来源方案里该词的全部编码)、${code_source}(编码来源方案名,直接用该方案输入时为空)、${unicode_all} / ${unicode_all:分隔符}(逐字码位)、${debug}(调试信息),以及逐字段里的 ${char}、${readings} / ${readings:N}、${unicode}。注释模板的变量同样可用。详见候选悬停提示 · 变量。
已退役的旧键 0.123 新增
下面六个开关已由 sections 取代。升级时自动迁移:按旧开关换算成外观一致的段列表写入用户配置,旧键随之从配置文件移除;用户配置里已写了 sections 时以它为准,旧键只删不换算。
| 旧键 | 类型 | 可选值 | 旧默认 | 迁移为 |
|---|---|---|---|---|
code_enabled | 布尔 | — | true | 「编码」段的 enabled |
pinyin_enabled | 布尔 | — | true | 「拼音」段的 enabled |
pinyin_heteronyms | 布尔 | — | true | false → 拼音段模板用 ${readings:1}(只取首音,优先于下一项) |
pinyin_max_readings | 整数 | — | 0 | N > 0 且 pinyin_heteronyms 没关 → 拼音段模板用 ${readings:N}(关了则以 ${readings:1} 为准) |
chaizi_enabled | 布尔 | — | false | 拼音同时开着 → 拼音、拆字两段合成一个「拆字 / 拼音」段(promote = "chaizi",行序同旧版);拼音关着 → 「拆字」段 enabled = true |
debug_enabled | 布尔 | — | false | 「调试」段的 enabled |
迁移以当时的出厂列表为底,所以老用户也会得到「完整原文」段(开)与「Unicode」段(关)。代价是段列表从此定格:以后版本新增的出厂段不会自动出现在已有 sections 的用户配置里,见已知局限。
工具栏(ui.toolbar)
[ui.toolbar]
visible = true # 是否显示常驻工具栏
hide_in_fullscreen = true # 全屏时自动隐藏
fullscreen_watch = true # 主动检测全屏状态
hide_in_english = false # 英文状态时隐藏
auto_hide = false # 无交互超时后自动隐藏
auto_hide_delay = 5 # 自动隐藏超时(秒)
auto_hide_hover_reveal = false # 自动隐藏后,鼠标移到原位即重新显示
vertical = false # 纵向排列(默认横条)
# 显示哪几格、按什么顺序(数组顺序即渲染顺序)
items = ["mode", "punct", "full_width", "-s2t", "soft_keyboard", "settings"]| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
visible | 布尔 | — | true | 是否显示常驻工具栏(启动初值,运行时可经菜单切换) |
hide_in_fullscreen | 布尔 | — | true | 前台应用全屏时自动隐藏工具栏 |
fullscreen_watch 0.122 新增 | 布尔 | — | true | 定期主动查询前台是否全屏。进出全屏本身不产生任何输入法回调(在输入框里按 F11、用播放器快捷键全屏),只靠焦点事件的话工具栏该隐没隐;关掉则只在焦点 / 激活事件到达时顺带查一次。仅在 hide_in_fullscreen = true 时有意义 |
auto_hide | 布尔 | — | false | 自动隐藏:显示后超时无交互则淡出(悬停 / 拖动顺延;默认关) |
hide_in_english 0.123 新增 | 布尔 | — | false | 中英切到英文时隐藏工具栏,切回中文即重新显示。临时英文、大写锁定仍算中文状态,不受影响。与全屏隐藏可叠加 |
auto_hide_delay | 整数 | — | 5 | 自动隐藏超时(秒);下限 1 由协调器钳制 |
auto_hide_hover_reveal 0.123 新增 | 布尔 | — | false | 自动隐藏的附加选项,开启后改为「假隐藏」:淡出后工具栏仍留在原位(几乎透明),鼠标移到那里即重新显示,移开后满 auto_hide_delay 秒再淡出。隐藏期间那一小块区域的点击落在工具栏上。关掉则淡出后彻底隐藏,只在切换中英等状态变化时出现。仅在 auto_hide = true 时有意义;全屏、英文状态等场合的隐藏仍是彻底隐藏 |
vertical | 布尔 | — | false 0.115 新增 | 纵向排列:竖着摆放工具栏(默认横条)。几何仍取主题 [toolbar]:条宽 = height、每格高 = button_width |
items | 字符串数组 0.119 新增 | mode / punct / full_width / s2t / soft_keyboard 0.120 新增 / settings / custom:<id>,名字前可加 - | ["mode", "punct", "full_width", "-s2t", "soft_keyboard", "settings"] | 显示哪几格、按什么顺序——数组顺序即渲染顺序。留空 = 全部内置项。名字前加 -(如 "-s2t")表示不显示但记住它排在这个位置,设置页关掉某格时写的就是这个。s2t 出厂关着,去掉那个 - 就能随时点它开关简入繁出;隐藏 settings 不影响使用,右键工具栏任意位置同样能打开菜单。整条工具栏都不想要请用 visible = false |
自定义按钮(ui.toolbar.buttons) 0.119 新增
往工具栏加一格自己的按钮,点击执行一个动作——比如加个「符」打开系统字符映射表。
也可以在设置页里配
设置工具 → 外观 → 工具栏 → 「显示内容」→ 左下「新建按钮…」。填真实路径即可, 不必自己处理反斜杠转义。本节是给想直接改配置文件的人看的。
定义按钮和显示按钮是两步:[[ui.toolbar.buttons]] 只是定义,还要在上面的 items
里写一条 custom:<id> 才会显示。这样你可以先定义好几个、按需往工具栏上放。
[ui.toolbar]
items = ["mode", "punct", "full_width", "custom:sym", "settings"]
[[ui.toolbar.buttons]]
id = "sym" # 稳定标识,被 items 里的 custom:sym 引用
label = "符" # 格内文字:一个汉字,或两个字母
action = 'proc.run("charmap.exe")' # 点击执行
enabled = true # 关掉即不显示,items 里那条留着记住位置| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
id | 字符串 | — | 稳定标识,供 items 里的 custom:<id> 引用 |
label | 字符串 | — | 格内文字。一个汉字或两个字母,超出自动截断——工具栏各格等宽,一格写多了会破坏整条的节奏 |
action | 字符串 | — | 点击执行的动作,语法与短语、命令栏一致 |
enabled | 布尔 | true | 关掉即不显示 |
action 可用的写法与短语里完全一样,常用这几种:
| 写法 | 作用 |
|---|---|
open("https://www.zdic.net") | 打开网址 / 文件 / 程序(等同于双击它) |
proc.run("notepad.exe") | 启动程序,可带参数与 cwd= / verb="runas" / show="min" |
wind.cli("schema switch wubi86") | 调用本输入法的命令,如一键切方案 |
key.tap("Ctrl+Shift+P") | 模拟一次按键组合 |
两点注意
action 里含双引号,整体要用单引号包起来。
按钮没有悬停提示——工具栏目前没有提示气泡机制。选 label 时挑个自己一眼认得的字。
导入别人的配置片段时留意这一项
自定义按钮能启动程序,而配置片段可以写入这一项。导入来源不明的配置片段前,
先看一眼预览里有没有 ui.toolbar.buttons。
任务栏图标(ui.langbar) 0.117 新增
Windows 任务栏上那个显示「中 / 英 / 拼 / 五」的输入指示器。这一段配置的是叠在主字上的 状态角标——不用把鼠标移到工具栏,扫一眼任务栏就知道当前是中文标点还是英文标点、是不是全角。
出厂全关:角标叠加在系统的输入指示器上,默认开启会改变每个人的任务栏。总开关在 外观设置 → 任务栏图标里。macOS 无此功能。
全局项 0.120 新增
[ui.langbar]
badge = "none" # 总开关:none = 不显示|corner = 角标
badge_scale = 1.0 # 所有角标的大小倍率
badge_alpha = 0.88 # 不透明度的默认值,同时是档位开关(见下)| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
badge | 枚举 | none / corner | none | 总开关。关掉即下面全部规则都不画,不必逐条去关。写错的值一律回落 none |
badge_scale | 小数 | — | 1.0 | 整体大小倍率。单条规则还能用自己的 scale 再乘一次 |
badge_alpha | 小数 | 0~1 | 0.88 | 不透明度的默认值;单条可用自己的 alpha_light / alpha_dark 覆盖。同时是档位开关,见下 |
主字颜色 0.123 新增
主字(「中」「英」「拼」……)的颜色按「中文态 / 英文态 × 浅色 / 深色任务栏」分四格:
[ui.langbar]
text_color_cn_light = "" # 中文态,浅色任务栏
text_color_cn_dark = "" # 中文态,深色任务栏
text_color_en_light = "" # 英文态,浅色任务栏
text_color_en_dark = "" # 英文态,深色任务栏| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
text_color_* | 字符串 | "" / #RRGGBB / #RRGGBBAA | "" | "" = 跟随主题。末两位 AA 是主字的不透明度。写错的值只让那一格回落主题(日志里有警告) |
取色顺序:这里填了就用这里的 → 否则用主题的 langbar_text_cn / langbar_text_en → 主题也没写就浅色任务栏黑、深色任务栏白。
四格各自回落,只改一格其余照常跟主题。「英文态」包括英文模式、大写锁定,以及密码框等不能输入中文的场合。
角标颜色留空("")的,跟着这里的主字色走。
输入法服务还没就绪时(开机最初一两秒、服务重启的瞬间),图标由系统侧临时画,这时是黑白,就绪后恢复你配的颜色。
主题里的写法(light / dark 指任务栏深浅,不是主题自己的明暗风格):
[colors]
langbar_text_cn = { light = "#1A4FA0", dark = "#8EC5FF" }
langbar_text_en = { light = "#000000", dark = "#FFFFFF" }角标规则表 0.120 新增
一条规则 = 「某个状态成立时,在某个角落用某个颜色画一个角标」。出厂三条:
[[ui.langbar.badges]]
enabled = true
state = "punct_cn" # 中文标点
corner = "bottom_right"
color_light = "#2288E0" # 浅色任务栏上的颜色
color_dark = "#2288E0" # 深色任务栏上的颜色
scale = 1.0
[[ui.langbar.badges]]
state = "punct_en" # 英文标点
corner = "bottom_right"
color_light = "#EE9922"
color_dark = "#EE9922"
[[ui.langbar.badges]]
state = "full_width" # 全角
corner = "top_right"
color_light = "#E0447A"
color_dark = "#E0447A"| 键 | 类型 | 可选值 | 默认 | 说明 |
|---|---|---|---|---|
enabled | 布尔 | — | true | 这条画不画。想「中文标点时不受打扰、只在英文标点时提醒」,把第一条改成 false 即可——颜色和位置都还留着,想回来勾上就行 |
state | 枚举 | punct_cn / punct_en / full_width | 无 | 什么时候画。写错会让整条规则被丢弃(日志里有警告):状态没有合理的默认值,回落到任意一个都是替你瞎猜 |
corner | 枚举 | top_left / top_right / bottom_right / bottom_left | bottom_right | 画在哪个角 |
color_light | 字符串 | "" / #RRGGBB | "" | 浅色任务栏上的颜色。"" = 与主字同色 |
color_dark | 字符串 | 同上 | "" | 深色任务栏上的颜色。同一个色在深浅两种任务栏上的可辨度可以差很远,所以分两个字段 |
alpha_light 0.123 新增 | 小数 | 0~1 | 未设置 | 浅色任务栏上这一条自己的不透明度。未设置 = 跟随 badge_alpha;1.0 = 挖空档(见下) |
alpha_dark 0.123 新增 | 小数 | 同上 | 未设置 | 深色任务栏上这一条自己的不透明度,语义同上 |
scale | 小数 | — | 1.0 | 本条相对整体大小的额外倍率。填 0 或负数 = 这一条不画(但表达这个意思该用 enabled) |
顺序即优先级:两条规则若配在同一个角落又同时成立,只画最靠前的那一条——16 像素上叠两个 三角会糊成一片。出厂两条标点规则同占右下角不冲突,因为它们的状态互斥,同一时刻只可能命中一条。
- 旧写法
color_* = "auto"与八位色值#RRGGBBAA(末两位是这一条的不透明度)仍可读取,会自动迁移 0.123 新增:auto迁成"",八位色值拆成六位色值 +alpha_*(AA / 255,FF即1.0)
alpha 填 1.0 不只是「最不透明」
alpha_light = 1.0 会把这一条切到挖空档(角标实心 + 周围切掉一圈主字),与半遮是两种不同的画法,
见下一节。想要「几乎不透明但仍是半遮」,写 0.99 而不是 1.0。
badge_alpha 是档位开关,不只是深浅
它跨过 1.0 时会换一种画法,不是简单的透明度渐变:
= 1.0— 角标实心,并在它周围切掉一圈主字(靠留白与主字分离)。代价是右下有笔画的 字(「五」「双」「拼」)会被切掉一角,看起来像缺笔。< 1.0— 角标半透明,主字保留完整,笔画从角标里透出来(靠色差分离)。默认走这一档。
两者是互斥的两种手段,不要指望「挖空 + 调淡」叠加:那样主字先被切掉一圈、没有笔画可透, 调这个值会看起来毫无效果。
模式主字(ui.labels) 0.118 新增
任务栏图标、工具栏模式格、状态气泡上那个「中 / 英 / 五 / 拼」的字,这里配的是 非中文状态下显示成什么。
[ui.labels]
english = "英" # 英文半角:按 Shift 切出的英文状态
caps_lock = "A" # 大写锁定| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
english | 字符串 | 英 | 英文半角状态的主字。宽度上限为一个汉字;留空则用默认值 |
caps_lock | 字符串 | A | 大写锁定状态的主字。宽度上限为一个汉字;留空则用默认值 |
中文状态的字在方案文件里
打中文时显示的「五」「拼」是方案自己的属性,配在方案文件的 [schema] icon_label,
不在这一段。切换方案时它跟着变,而 [ui.labels] 这两个是全局状态、与用哪个方案无关。
想让英文状态显示 En 而不是「英」:
[ui.labels]
english = "En"两个字母的宽度约等于一个汉字,16px 的任务栏图标放得下。
上限按显示宽度算,一个汉字占 2、其余字符占 1,总宽不超过 2:En 完整显示,
English 截成 En,而「符号」这类两个汉字会截成「符」——两个汉字挤进 16px 的图标里
只能把字号缩掉一半,反而认不出。方案文件里的 [schema] icon_label 同一口径。
这一段只能改配置文件
[ui.labels] 是高级选项,设置页里没有对应的开关。改完重启输入法生效。
相关阅读
对这篇文档有疑问,或发现内容有误?
欢迎到文档仓库提 issue,写明问题时附上本页链接即可。