主题与兼容性
导入与导出主题、主题包 .wtheme、主题市场、主题编辑器,自制主题的文件结构,以及应用兼容性规则
「外观」页的主题卡(选主题、导入、导出、主题市场)与底部的主题编辑器卡,以及自制主题、修复个别应用显示问题的方法。
获取更多主题
| 入口 | 说明 |
|---|---|
| 导入主题 0.122 新增 | 打开导入对话框,三条路任选:本地文件(.toml 主题 / .wtheme 主题包)、HTTPS 链接、粘贴主题原文 |
| 导出主题 0.122 新增 | 把下拉里选中的主题打成 .wtheme 发给别人,见主题包 |
| 打开主题市场 | 前往 market.windinput.com 挑选现成主题 |
| 主题编辑器 | 见下 |
从链接导入会先校验
从 HTTPS 链接导入主题时会先交给核心程序校验内容再落盘;导入前的对话框会提示确认来源可信。
主题包 .wtheme 0.122 新增
主题一旦带了背景图、图标这类资源,单个 .toml 文件就分发不动了——图片没法塞进 TOML。
主题包把主题文件和它引用的资源打成一个 .wtheme,收发都只是一个文件。
纯配色主题不需要它,继续用 .toml 或链接分享即可。
装一个主题包:
- 「外观」页 → 主题卡 → 导入主题 → 选择文件(
.toml与.wtheme在同一个选择框里) - 或双击
.wtheme文件——这条需要先在系统集成注册关联; 不想注册关联的话走上面那条,一样能装
两条路都会先弹确认框告诉你包里是什么(主题名、作者、版本、几个资源文件)再决定装不装—— 主题包多半是从网上下回来的,双击就直接改掉当前外观不合适。撞上同名主题时会问要不要覆盖。
做一个主题包:「外观」页 → 主题卡 → 导出主题,选个保存位置即可。 导出的是主题选择里此刻选中的那个,改了还没保存也照导——所见即所导。
命令行也能做,且能直接指定要导哪个,见 wind_input theme export:
wind_input theme export 我的主题 D:\分享\我的主题.wtheme内置主题也导得出——把内置主题改了配色想发给别人,这是最省事的路子。
包里装什么:
| 条目 | 说明 |
|---|---|
theme.toml | 主题本体,必须有 |
assets/ | 背景图等资源,主题文件里以 assets/xxx.png 相对路径引用 |
preview.png | 可选,主题市场用的预览图 |
package.toml | 可选,主题名/作者/版本等元信息;没有时从主题自身的 [meta] 读 |
主题目录里的其它文件(编辑器草稿、系统生成的缩略图数据库等)不会进包。
包有大小限制
最多 200 个文件、解压后 32 MB。超出的包导不出也导不进——这道限制挡的是误把原图拷进
assets/ 那类情况,正常主题远够用。
主题编辑器
开启后,Web 版主题编辑器可以直接读写本机主题,边改边看效果——不必反复导出导入文件。
服务仅监听本机回环地址,不对外网开放。三档:
| 档位 | 说明 |
|---|---|
| 关闭 | 不启动本地服务 |
| 本次开启 | 本次运行期间可用,重启后回到关闭 |
| 自动开启 | 每次启动都开 |
开启后可复制本地连接地址,粘贴到编辑器里建立连接。
自制主题
把主题文件放入 %APPDATA%\WindInput\themes\<主题名>\theme.toml(macOS 为 ~/Library/Application Support/WindInput/themes/<主题名>/theme.toml),即可在「主题选择」中出现。若主题名与内置主题相同(如 default),你这份会整份替换内置的那个,见同结构覆盖机制。
复杂配色建议用编辑器做
主题文件为 TOML 格式(v3)。最省事的做法是继承一个内置主题,只覆盖需要改动的部分;复杂的几何与配色建议直接用主题编辑器可视化制作。内置主题文件位于安装目录下的 data\themes\ 文件夹,可作模板。
快速上手:继承内置主题
声明 base 并只写要改的颜色,其余从内置主题继承:
base = "default"
[meta]
name = "我的蓝色主题"
[colors]
primary = "#0066CC" # 只改主色,其余外观沿用 default主题文件结构
主题由若干顶层块组成,均可选,未写的部分从被继承主题回退:
| 块 | 说明 |
|---|---|
base | 继承的内置主题名(default / msime 或内置基础主题 _base / _qingfeng) |
[meta] | 元信息:name(必填)、version、author 等 |
[colors] | 颜色 token 表(扁平),语义色的唯一来源,[views] 通过 ${token} 引用 |
[resources] | 图片资源引用(可选,支持亮暗分设) |
[views] | 几何与布局(候选窗 / 工具栏 / 菜单的盒模型) |
[behavior] | 主题推荐的行为默认(见下) |
[colors] 块是所有颜色的唯一来源:
- 亮暗分设:值写成
{ light = "...", dark = "..." }表示亮暗不同颜色;写成单个字符串则亮暗共用;只写一侧时另一侧自动回退 - token 引用:
"${tokenName}"引用同表中另一个 token 的值 - 颜色格式:
"#RRGGBB"/"#RRGGBBAA"(支持 alpha 透明度)/"transparent" - 3 位简写
"#RGB"0.123 新增:"#F80"即"#FF8800",必须带#(fed、ace这类英文单词 不会被当成颜色)。0.122 及更早的版本其实不认 3 位写法,写了等于没配、回落到继承来的颜色;升级后这些 颜色开始生效,用过 3 位色的主题外观会随之变化。语言栏的颜色配置同样适用
[behavior] 中的值是主题给用户的推荐默认,用户可在「外观」页单独覆盖,覆盖跨主题切换保持:
| 字段 | 类型 | 说明 |
|---|---|---|
font_size | number | 候选字号基准(pt) |
always_show_pager | bool | 始终显示翻页栏(即使只有一页) |
hide_pager | bool | 隐藏整个翻页栏(含箭头) |
show_page_number | bool | 显示页码文字 |
pager_align | string | 独立翻页栏行的水平对齐(left / center / right,默认 center);仅竖排独立翻页栏生效,翻页栏并入编码栏时固定右对齐 |
vertical_max_width | number | 竖排模式最大宽度(dp),0 = 不限 0.118 新增。出厂 0.118 起由 600 改为 0——超宽候选此前会被硬裁且不带省略号。仍需上限的主题显式配即可 |
[views] 按具名节点描述各窗口的盒模型(内外边距、边框、圆角、背景、字体、阴影等),字段较多且随版本演进。制作或调整几何时,建议直接以内置主题文件为模板,或用主题编辑器可视化编辑。
背景图的九宫格中段 0.122 新增
背景图配了 slice(九宫格边距)时,中段默认是拉伸的。候选窗的宽度随候选内容不停变,于是有纹理的背景会跟着「呼吸」——这在中段占了原图大半宽度的主题上尤其明显。
给那个图片节点加 slice_repeat 即可改成平铺:
slice_repeat = "repeat" # 两轴都平铺
slice_repeat = ["repeat", "stretch"] # 横轴平铺、纵轴拉伸取值只有 repeat 与 stretch(不写 = stretch,即 0.121 及以前的行为)。分轴写是有用的:横轴随宽度变,纵轴通常固定,一个值管两轴会让一张宽图在 40px 高的编码条里从「压扁到条高」变成「只取顶部 40 行」。
文字角色色 0.123 新增
候选注释与悬停提示里的文字,每一段都带着一个角色——它是哪个变量产出的(pinyin、code_rev……),
或是模板里写死的文字(literal)、气泡的段名(title)。主题可以按角色配色,不用改模板:
[comment.roles]
pinyin = "${text_dim}"
code_rev = "${accent_text}"
literal = { light = "#B0B0B0", dark = "#606060" }
[tooltip.roles]
title = "${tooltip_accent}"
readings = "#9AD0FF"注释模板是 ${code_rev}{ (${pinyin})} 时,编码显示为强调色、注音为次要文字色,括号为浅灰。
写在哪:
| 表 | 作用于 |
|---|---|
[comment.roles] | 候选注释,平时 |
[comment.selected.roles] | 候选注释,候选被选中(高亮)时 |
[comment.hover.roles] | 候选注释,鼠标悬停时 |
[comment_above.roles] 0.124 新增 | 上方注释条,平时 |
[comment_above.selected.roles] 0.124 新增 | 上方注释条,候选被选中时 |
[comment_above.hover.roles] 0.124 新增 | 上方注释条,鼠标悬停时 |
[tooltip.roles] | 悬停提示(气泡没有选中、悬停之分,写 [tooltip.selected.roles] 不生效) |
只有注释、上方注释条与悬停提示读这张表,写在其它节点下的 roles 被忽略。
值的写法与节点的 color 相同:"${token}"、"#RRGGBB"、{ light = "…", dark = "…" }。另外:
""表示不配色、跟随正文色。派生主题用它撤销被继承主题配的某个角色。"transparent"与完全透明的颜色(如"#FF000000")不收,按没配处理——文字占着位置却看不见,只会是误写。- 派生主题的
roles与被继承主题的逐个角色合并,只写要改的那几个即可。 [tooltip.roles]里写"${error}"取到的是候选窗用的error(为浅色底调的深红)。气泡里要可读的版本, 写"${tooltip_error}",见标准色。- 引擎不检查角色名:写错了(如
pinyn)只是不生效,不报错。 - 彩色 emoji 自带颜色,
emoji角色的配色对它基本无效。
角色名
| 角色 | 中文名 | 哪段文字 |
|---|---|---|
code_hint | 剩余编码 | ${code_hint} |
emoji | Emoji | ${emoji} |
code_rev | 反查编码 | ${code_rev}(含旧名 ${code}) |
code_rev_all | 反查编码(全部) | ${code_rev_all}(含旧名 ${code_all}) |
shuangpin | 双拼编码 | ${shuangpin} |
pinyin | 拼音 | ${pinyin} |
chaizi | 拆字 | ${chaizi} |
chaizi_code | 拆字编码 | ${chaizi_code} |
chaizi_all | 拆字(逐字) | ${chaizi_all} |
chaizi_code_all | 拆字编码(逐字) | ${chaizi_code_all} |
dict | 注释库 | ${dict} |
word_code | 词的编码 | ${word_code}(气泡) |
code_source | 编码来源 | ${code_source}(气泡) |
debug | 调试信息 | ${debug}(气泡) |
full_text | 完整原文 | ${full_text}(气泡) |
unicode_all | Unicode(逐字) | ${unicode_all}(气泡) |
readings | 读音 | ${readings}(气泡逐字段) |
unicode | Unicode | ${unicode}(气泡逐字段) |
char | 当前字 | ${char}(气泡逐字段) |
title | 段名 | 气泡段名里写死的文字,以及段名两侧的 [ ]、inline 段的 : |
literal | 模板字面文字 | 模板里写死的文字:括号、冒号、空格、制表符等 |
几条细则:
${a|b|c}的角色是实际取到值的那个变量:${code_hint|code_rev}取到反查码时是code_rev。${name:参数}的角色就是name,参数不影响。- 段名里的变量(如
编码{(${code_source})}里的五笔)没单独配色时跟title走,整个段名同色。 - 变量名拼错而原样显示的
${pinyn}没有角色,始终是正文色,在段名里也不跟title。 - 截断加的
…与它前面那个字同色。
哪个颜色生效
一段文字按这个顺序取色,取到即止:
- 模板里的内联颜色
$[颜色]{…}(它另有一套 选中与悬停的规则); - 选中或悬停时,
[comment.selected.roles]/[comment.hover.roles]里给这个角色配的颜色(上方条读[comment_above.selected.roles]/[comment_above.hover.roles],没写则回退到注释的同名表); - 选中或悬停时,若主题给这个状态换了注释颜色(
[comment.selected] color等),用换过的那个; [comment.roles]/[tooltip.roles]里给这个角色配的颜色(上方条读[comment_above.roles],没写则回退[comment.roles]);- 段名里的变量:
title的颜色; - 正文色(节点的
color)。
第 3 条是为可读性兜底:选中底换成深色实心块的主题,必然也把选中态注释换成了浅色;平时为浅色底调的
角色色直接搬到深色底上多半看不清,退回主题作者为这个状态亲自选的颜色最稳妥。想在选中时仍然分色,
就在 [comment.selected.roles] 里单列(见下面的配方)。
「换了」看的是最终显示的颜色:写了 [comment.selected] color、但与平时相同,也算没换。亮色、暗色模式
各自判断。出厂主题都没给选中、悬停换注释颜色,所以角色色在选中时照常显示。
出厂主题的角色色
出厂主题都继承基础主题 _base,它给悬停提示配了这一组角色色(颜色名见标准色)。
候选注释不配,保持原来的注释色:
| 表 | 角色 | 颜色 |
|---|---|---|
[tooltip.roles] | full_text、readings | ${tooltip_accent_text}(随主题强调色) |
[tooltip.roles] | word_code | ${tooltip_success} |
[tooltip.roles] | code_source、chaizi_code、chaizi_code_all | ${tooltip_info} |
[tooltip.roles] | chaizi、chaizi_all | ${tooltip_warning} |
[tooltip.roles] | unicode、unicode_all | ${tooltip_error} |
- 写的是
tooltip_*:角色表里的${…}按字面取色,不像模板内联色那样先找tooltip_版本, 写${info}在亮色模式下拿到的是为浅色底调的深蓝,压在深色气泡上看不清。 - 继承
_base的主题自动拿到这张表。要换色,在自己的[tooltip.roles]里写同名角色;要去掉,写""。 想给候选注释分色,自己写[comment.roles]。 - 没写
base的主题不继承这张表,气泡保持正文色。 - 模板里的内联颜色优先于这些角色色。
上方注释条 0.124 新增
打开「注释首行显示在候选上方」后,注释的上段画在候选上方,
它的样式由 [comment_above] 节点管,字段与 [comment] 相同。
回退规则——没写的字段这样取:
| 字段 | 没写时 |
|---|---|
| 字体、字重、字号、颜色 | 继承 [comment] |
[comment_above.roles](含 selected、hover 各态) | 继承 [comment.roles] |
[comment_above.selected]、[comment_above.hover] 的字体、颜色 | 继承 [comment] 对应状态 |
margin、padding | 不继承,默认 0 |
边距不继承,是因为 [comment] 的 margin.left 是「文字与右侧注释的间距」,只给右侧用;
上方条若继承会被推歪。上方条与主行之间的间距,用它自己的 padding.bottom(或 margin.bottom)调。
上方条同样消费背景、边框(含选中、悬停态);背景图与渐变只作用于基态。这些装饰不继承 [comment],
状态节点也是:[comment.selected] 只贡献字体、颜色与 roles,它的底色、边框、边距不会带到
[comment_above.selected]。模板里的内联颜色与 roles 对上方条同样生效。
最小示例——上方条比基础主题的注释(font_size = -4,字号是相对正文的偏移)再小一号、换成次要文字色,并与主行留出 2 的间距:
[comment_above]
font_size = -6
color = "${text_dim}"
padding = { bottom = 2 }不打开开关时这个节点不起作用。
标准色 0.123 新增
下面这些颜色名由内置基础主题 _base 给出默认值,内置主题都继承它;不继承任何主题的独立主题没写的,
输入法按下面的规则补上。所以模板的内联颜色
在任何主题里写这些名字都一定能取到,并跟随主题与明暗。
主题里也可以覆盖它们,或用 ${名字} 引用。注意补上的名字只供模板取色:不继承 _base 的主题,
[colors] 和各窗口配置里的 ${名字} 只能引用主题自己写了的名字。
没继承 _base 的主题怎么补(没写 base,或 base 链上没有 _base):
- 主题
[colors]里写了的名字用主题自己的,一个都不会被换掉;没写的才补。 - 补的只有下面两张表里的名字。
_base的其它内容(窗口布局、菜单、工具栏的颜色……)一概不带进来。 - 补的值取
_base的;其中引用别的名字的,按本主题的颜色算:accent_text是本主题的accent,selection_text是本主题的text,tooltip_text暗色那一档是本主题的text。本主题也没写的, 再用_base的。 - 例外:主题连气泡底色
tooltip_bg也没写时,tooltip_text用输入法原来的气泡文字色(浅灰白#F0F0F5, 亮暗一样),气泡看起来和以前完全一样。
气泡底是浅色的主题,要自己写 tooltip_ 那一组
补上的 tooltip_* 是为深色气泡底调的。主题把气泡底(tooltip_bg)配成浅色的话,这些颜色放上去看不清,
请在主题里自己写 tooltip_text、tooltip_error 等。同理,补上的 tooltip_accent 是 _base 的蓝色,
不随主题的强调色变。
补上的名字也会用在几处按名取色的地方,主题没写它们时外观会有变化:
- 气泡正文颜色取
tooltip_text:写了tooltip_bg、没写tooltip_text的主题,暗色模式下气泡文字是主题的text。气泡底配成了浅色,或者text只写了一个深色值(没有暗色档)的,都要自己写上tooltip_text, 否则暗色下气泡文字看不清。 - 候选窗翻页箭头的灰显色取
text_hint;翻页栏没配文字颜色时,页码取text_dim。
候选窗用(为候选窗底色调):
| 名字 | 用途 | 亮色 | 暗色 |
|---|---|---|---|
text | 主文字 | #1E1E1E | #E0E0E0 |
text_dim | 次要文字 | #646464 | #B0B0B0 |
text_hint | 提示文字(注释默认色) | #969696 | #808080 |
accent | 强调色 | ${primary}(#4285F4) | 同左 |
on_accent | 强调色底上的文字 | #FFFFFF | 同左 |
selection_text | 选中候选的文字 | ${text} | 同左 |
accent_text | 可读的强调文字色 | ${accent} | 同左 |
success | 成功 / 肯定 | #1E8E3E | #81C995 |
warning | 提醒 | #B06000 | #FDD663 |
error | 错误 / 否定 | #D93025 | #F28B82 |
info | 说明 / 补充 | #1A73E8 | #8AB4F8 |
表中是 _base 的值,各主题可以覆盖:清风系主题(清风·蓝 / 橙 / 绿 / 紫)的 text
三档与 accent_text 都是自己调过的,名字不变。
悬停提示用(为深色气泡底调):上表每个名字 x 都有一个 tooltip_x。内联颜色在气泡里写 x
时先取 tooltip_x,所以同一个模板在候选窗和气泡里都看得清。
| 名字 | 亮色 | 暗色 |
|---|---|---|
tooltip_text | #FFFFFF | ${text} |
tooltip_text_dim | #BDBDBD | #BDBDBD |
tooltip_text_hint | #A0A0A0 | #A0A0A0 |
tooltip_accent | #8AB4F8 | #8AB4F8 |
tooltip_accent_text | ${tooltip_accent} | 同左 |
tooltip_on_accent | ${tooltip_text} | 同左 |
tooltip_selection_text | ${tooltip_text} | 同左 |
tooltip_success | #81C995 | #81C995 |
tooltip_warning | #FDD663 | #FDD663 |
tooltip_error | #F28B82 | #F28B82 |
tooltip_info | #8AB4F8 | #8AB4F8 |
tooltip_on_accent、tooltip_selection_text 在气泡里没有对应的场景,等于气泡文字色,写了也看得清。
tooltip_accent 随主题的强调色换:
| 主题 | tooltip_accent |
|---|---|
_base、微软风格(msime) | #8AB4F8 |
清风·蓝(default,取自 _qingfeng) | #60a5fa |
清风·橙(amber) | #fbbf24 |
清风·绿(jade) | #34d399 |
清风·紫(violet) | #a78bfa |
改了 primary,也改 tooltip_accent
继承内置主题、只改了 primary 的话,气泡里的强调色仍是被继承主题的那个蓝色——看得清,但与候选窗
不同色。想一并换色,给 tooltip_accent 配一个在深色底上够亮的同色相颜色(通常取你 accent_text
暗色那一档的值)。不能直接写 ${accent_text}:它亮色那一档是为白底调的深色,放进气泡看不清。
配方:给注释与气泡分色 0.123 新增
以下片段都写在你自己的主题文件里,放法见上文「自制主题」。
淡化装饰、突出信息
括号、冒号这类装饰退后,编码与注音更醒目:
base = "default"
[meta]
name = "清风·蓝·分色"
[comment.roles]
literal = { light = "#B8BDC8", dark = "#4A5163" } # 括号、冒号更淡
code_hint = "${accent_text}"
code_rev = "${accent_text}"
pinyin = "${text_dim}"
chaizi = "${text_dim}"
[tooltip.roles]
title = "${tooltip_text_hint}" # 段名退后
literal = "${tooltip_text_hint}"
readings = "${tooltip_accent}"派生主题只改角色色
喜欢某个主题的整体外观,只想加点分色:继承它,只写 roles。
base = "violet"
[meta]
name = "清风·紫·编码高亮"
[comment.roles]
code_rev = "${accent_text}"
[tooltip.roles]
title = "${tooltip_accent}"被继承的主题已经配了角色、你想去掉其中一个时,写空串:
[comment.roles]
pinyin = "" # 拼音回到注释正文色选中时保留编码高亮
主题把选中态注释换了颜色时(例如选中底是深色实心块),平时配的角色色在选中时会统一回落到那个颜色
(见哪个颜色生效)。想让编码在选中时仍然醒目,在 [comment.selected.roles] 里
为深色底另配一个:
[comment.roles]
code_rev = "${accent_text}"
[comment.selected]
color = "${on_accent}" # 选中态注释改为白色(你的主题本来就有这一行)
[comment.selected.roles]
code_rev = "#FFE08A" # 选中时编码用浅黄,其余注释仍是白色出厂主题没有换选中态注释颜色,用不着这一步。模板里的内联颜色对应的写法是 selected=,见
选中与悬停时的颜色。
macOS 上的生效范围
主题在 macOS 上只覆盖输入法自绘的界面:候选窗完全生效,状态提示气泡与候选悬停提示框的配色生效。
不生效的两处:
- 功能主菜单——macOS 上是原生系统菜单,由系统绘制,外观跟随 macOS 自身的浅色 / 深色与强调色。主题里的菜单配色与几何对它无效
- 工具栏——macOS 没有浮动工具栏,改用菜单栏的输入模式指示器,主题里的工具栏节点无处落地
也就是说,同一份主题在两个平台通用,[views] 里的菜单与工具栏节点在 macOS 上被忽略、其余部分照常。「主题风格」(跟随系统 / 浅色 / 深色)仍然有效。详见 macOS 版 · 菜单不支持主题。
应用兼容性规则
候选框在某个程序里飘到错误位置、候选窗被盖住看不见、或想让某个程序默认英文——这些靠 compat.toml 的逐应用规则修正,与主题无关。完整字段与用法见应用兼容性规则。
对这篇文档有疑问,或发现内容有误?
欢迎到文档仓库提 issue,写明问题时附上本页链接即可。