设置说明外观设置

主题与兼容性

导入与导出主题、主题包 .wtheme、主题市场、主题编辑器,自制主题的文件结构,以及应用兼容性规则

v0.124.0

「外观」页的主题卡(选主题、导入、导出、主题市场)与底部的主题编辑器卡,以及自制主题、修复个别应用显示问题的方法。

获取更多主题

入口说明
导入主题 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_sizenumber候选字号基准(pt)
always_show_pagerbool始终显示翻页栏(即使只有一页)
hide_pagerbool隐藏整个翻页栏(含箭头)
show_page_numberbool显示页码文字
pager_alignstring独立翻页栏行的水平对齐(left / center / right,默认 center);仅竖排独立翻页栏生效,翻页栏并入编码栏时固定右对齐
vertical_max_widthnumber竖排模式最大宽度(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}
emojiEmoji${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_allUnicode(逐字)${unicode_all}(气泡)
readings读音${readings}(气泡逐字段)
unicodeUnicode${unicode}(气泡逐字段)
char当前字${char}(气泡逐字段)
title段名气泡段名里写死的文字,以及段名两侧的 [ ]、inline 段的 :
literal模板字面文字模板里写死的文字:括号、冒号、空格、制表符等

几条细则:

  • ${a|b|c} 的角色是实际取到值的那个变量:${code_hint|code_rev} 取到反查码时是 code_rev。
  • ${name:参数} 的角色就是 name,参数不影响。
  • 段名里的变量(如 编码{(${code_source})} 里的 五笔)没单独配色时跟 title 走,整个段名同色。
  • 变量名拼错而原样显示的 ${pinyn} 没有角色,始终是正文色,在段名里也不跟 title。
  • 截断加的 … 与它前面那个字同色。

哪个颜色生效

一段文字按这个顺序取色,取到即止:

  1. 模板里的内联颜色 $[颜色]{…}(它另有一套 选中与悬停的规则);
  2. 选中或悬停时,[comment.selected.roles] / [comment.hover.roles] 里给这个角色配的颜色(上方条读 [comment_above.selected.roles] / [comment_above.hover.roles],没写则回退到注释的同名表);
  3. 选中或悬停时,若主题给这个状态换了注释颜色([comment.selected] color 等),用换过的那个;
  4. [comment.roles] / [tooltip.roles] 里给这个角色配的颜色(上方条读 [comment_above.roles],没写则回退 [comment.roles]);
  5. 段名里的变量:title 的颜色;
  6. 正文色(节点的 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,写明问题时附上本页链接即可。

去提 issue →

本页目录