设置说明外观设置

候选悬停提示

鼠标停在候选上弹出的提示框——由可自定义的段组成,能看完整原文、编码、读音、拆字、Unicode,右键可按段复制或上屏

v0.123.0
0.123 新增

鼠标在候选上停一会儿,旁边会弹出一个提示框(气泡),列出这个候选的编码、读音等信息。 气泡由若干段自上而下组成,每段是一个标题加几行内容,比如:

[编码(五笔)]
vbg
[拼音]
好:hǎo/hào

哪些段、什么顺序、每段显示什么,都可以自己定。段的内容用与候选注释 同一套模板语法和变量,会写注释模板就会写气泡。

这是进阶定制

出厂配置保留了以往气泡的内容与分段(编码、读音等按主题配色显示),多数人不需要改。本页面向想调整气泡内容的用户:只要编码、 想看 Unicode 码位、想让英文候选显示词典释义、想把拆字与拼音合成一段,等等。

设置位置:设置工具 →「外观」→ 候选项提示。那里可以逐段开关、调整顺序、编辑段名与模板, 也能从预设里添加常用的段;本页的全部内容也都可以直接写进 config.toml。

出厂有哪些段

顺序段名出厂内容
1完整原文开候选太长、在候选窗里被截断(末尾带 …)时,这里给出完整的文字;没被截断时整段不出现
2编码开这个词在编码来源方案里的全部编码,如 a/ab/abc。拼音方案下反查五笔时标题显示为「编码(五笔)」
3拼音开逐字列出读音,多音字全部列出
4拆字关逐字列出字根与拆字编码(需方案配了拆字库)
5Unicode关逐字列出码位,如 好:U+597D
6调试关编码来源、权重等内部诊断信息

对应的配置(data/config.toml 出厂值,想在此基础上改就整段复制过去):

[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}"

写了 sections 就是整表替换

[[ui.tooltip.sections]] 在你的 config.toml 里一出现,就整张表取代出厂列表,不是逐段合并。 只写一段,气泡里就只有这一段。想「在出厂基础上多开一段」,要把上面整张表复制过去再改。 删掉你配置里全部的 [[ui.tooltip.sections]],即回到出厂列表。

只要有任何一段有内容,候选就有气泡。英文、符号、emoji 候选也一样——比如在词库里有编码的 符号候选会显示「编码」段,挂了英汉注释库的英文单词可以显示释义(见配方)。

每段由什么组成

字段默认说明
enabledtrue段开关。关着的段留在列表里,想看时改回 true 即可,不必删了再加
label空段名,显示为 [段名] 独占一行;留空则没有标题行。段名本身也是模板,见下
template空段内容,语法与候选注释相同
each空求值粒度:空 = 整个候选求值一次;han = 每个汉字一次;char = 每个非空白字符一次。见逐字模式
promote空仅逐字段:填一个变量名,该变量有值的行排到前面。见合并拆字与拼音
inlinefalse内容恰好只有一行时,写成 段名: 内容,不另占一行标题

几条规则:

  • 段名里的文字不会因变量为空而消失。编码{(${code_source})} 在拼音方案下反查五笔时是 编码(五笔),直接打五笔时变量为空、括号那一截消失,剩下 编码——而不是整个标题都没了。
  • 段内容按换行拆成行,空行丢弃;所有行都为空,整段(连同标题)不显示。
  • 模板语法写错时的表现与候选注释相同:变量名拼错会原样显示出来,方便你发现。
  • each 写了不认识的值,按整段求值处理,并在日志里留一条警告。

给段内容上色 0.123 新增

段名与段内容里同样可以用内联颜色 $[颜色]{内容}, 写法与候选注释相同。例如让读音显示为强调色:

template = "${char}:$[accent]{${readings}}"

气泡与候选窗有两处不同:

  • 颜色名先取气泡专用的那一个:写 x 时先找主题里的 tooltip_x,没有再用 x。气泡底色是深的, 候选窗用的颜色多是为浅色底调的——$[error]{…} 在候选窗里是深红,放进气泡会看不清,所以在气泡里取到的是 调浅过的 tooltip_error。$[text]{…} 同理取到气泡文字色 tooltip_text。各颜色名在气泡里的值见 标准色;# 开头的固定色不受影响,写什么就是什么。
  • selected= 不起作用:气泡没有选中态。

不改模板也能分色:主题可以按变量名、以及段名(title)统一配色,见 文字角色色。出厂主题已经配好了一组:完整原文与读音用强调色, 编码用绿色,编码来源(「编码(五笔)」里的「五笔」)与拆字编码用蓝色,字根用黄色,Unicode 码位用红色; 好: 这类前缀和段名文字保持气泡文字色。具体见出厂主题的角色色。

变量

候选注释的全部变量在这里都能用(${pinyin}、 ${chaizi}、${code_rev}、${dict}……)。此外有几个气泡专属的:

变量用在内容示例
${full_text}整段候选的完整文字。只在候选被截断时有值,否则为空,于是整段自动消失中华人民共和国万岁万岁万万岁
${word_code}整段这个词在编码来源方案里的全部编码,短的在前,/ 连接a/ab/abc
${code_source}整段编码来源方案的名字;正在用该方案直接输入时为空五笔
${unicode_all}整段逐字码位,默认空格分隔;${unicode_all:、} 指定分隔符U+4F60 U+597D
${debug}整段调试信息正文(多行)
${char}逐字当前这个字好
${readings}逐字这个字的全部读音,常用的在前,/ 连接;${readings:2} 只取前 2 个hǎo/hào
${unicode}逐字这个字的码位,扩展区的字写五 / 六位U+597D、U+2A6D6

「用在」一列指这个变量在哪种段里有意义:「整段」变量在逐字段里也能写,但取的是整个候选的值, 每行都一样;逐字变量(${char} / ${readings} / ${unicode})只在逐字段里认得,写在整段段里 会像拼错的变量名一样原样显示出来。

编码从哪个方案来

${word_code} 回答「这个词在某个形码方案里怎么打」,这个方案(编码来源方案)这样定:

  • 当前是码表方案(五笔等):就是它自己,列出这个词的全部编码
  • 当前是混输方案:取它的主码表
  • 当前是拼音等其他方案:取主码表方案

编码是按词查词库得来的,不按取码规则推算。第一次用到某个方案的反查时,索引在后台构建, 这时「编码」段暂不出现,建好后自动补上。

它和注释里的 ${code_rev_all} 不是一回事:${code_rev_all} 只给拼音来源的候选反查主码表, 受「编码提示来源」开关管,码表方案下恒为空(候选的码就是你自己打的);${word_code} 对任何 候选都查,不受那个开关影响——在气泡里,想确认一个词的全部简码是常见需求。

逐字模式

拼音、拆字、Unicode 这几类信息是一个字一行的,靠 each 实现:设了 each 的段对每个字 求值一次,每字一行。

取值遍历哪些字
han汉字(含各扩展区)。判据是码位不小于 U+3400:「,!?」这类全角标点(U+FF00 区)和 emoji 也在其中,只是通常查不到读音,那一行就不出现;「。、「」《》」这类 CJK 标点(U+3000–303F)不在其中
char每个非空白字符,包括字母、数字、符号
  • 遍历的是候选在候选窗里显示出来的字(被截断的话只到截断处,不含末尾的 …)。一条 上百字的长短语不会把气泡撑成上百行,被截掉的部分看「完整原文」段。
  • 逐字段里,拼音、拆字、反查编码这类注释变量都按这一个字求值。比如 ${char}:${code_rev_all} 逐字列出每个字的全部编码,取自与「编码」段同一个编码来源方案 (按字求值时不受「编码提示来源」开关限制)。
  • ${char} 不算「这一行有内容」。${char}:${readings} 遇到查不到读音的字,整行不显示, 而不是留下一个孤零零的 龘:。规则是:一行里除 ${char} 以外的变量全为空,这行就丢掉。

合并拆字与拼音:promote

想让拆字和读音并排在一行(旧版开了拆字后的样子),用一个段代替「拼音」「拆字」两段:

[[ui.tooltip.sections]]
label = "拆字 / 拼音"
each = "han"
promote = "chaizi"
template = "${char}:{${chaizi}{ [${chaizi_code}]}\t}${readings}"

候选「你好」,拆字库里有「好」、没有「你」时:

[拆字 / 拼音]
好:女子 [vbg]	hǎo/hào
你:nǐ

逐项看这行模板:

  • { [${chaizi_code}]} 是内层可选段:没有拆字编码时,连方括号一起消失。
  • 外层 {…\t} 包住字根、编码和分隔用的制表符:这个字拆字库里没有,整截消失,得 你:nǐ。
  • 查不到读音时,${readings} 为空,会吞掉紧挨在它前面的那个制表符,得 好:女子 [vbg]。
  • 模板里的制表符 \t 让两列对齐。在设置页的对话框里输入 \t 同样生效。
  • promote = "chaizi":${chaizi} 有值的行排在前面,其余行按原文顺序跟在后面——所以「好」 在「你」之前。不写 promote 就按原文顺序。

promote 不是拆字专用的,填任何变量名都行,意思都是「这个变量有值的行排前面,两组内部各自 保持原文顺序」。

可选段可以嵌套

上面的模板用到了可选段套可选段。这是 0.123 起模板语法的变化,候选注释同样适用; 随之而来的要求是:模板里要写字面的花括号,必须成对出现。见候选注释的可选段嵌套。

长度与折行

气泡里最长的往往是「完整原文」段——一条长短语可以有上千字。两个键控制显示长度:

键出厂说明
max_chars200每行最多显示多少字,超出截断加 …;0 = 不限
wrap_width40一行显示到多宽就换行,按列计:汉字、全角字符、emoji 算 2 列,其余算 1 列;0 = 不折行
  • 先截断、再折行,都是逐行处理的。计数按人眼看到的字算:一个 emoji 组合、一个带附加 符号的字母都算一个,不会被从中间切开。
  • 折行落在一串英文、编码中间时,优先在空格、/、· 之后断开,a/ab/abc 不会被切成 a/ab/ab + c;折出来的续行不以空格开头。
  • 模板里写了制表符的段(如上面的「拆字 / 拼音」),带制表符的行不折——折开会把第二列甩到 下一行行首。
  • inline 段的 段名: 占第一行的宽度。
  • 截断和折行只影响显示。右键复制、上屏拿到的都是完整、未折行的原文。

右键菜单

在气泡上点右键,菜单项取决于点在哪里:

点在哪菜单项
某一段(标题或内容)复制「段名」 · 上屏「段名」
逐字段里的某一行另加:复制此行 · 上屏此行
任何位置复制全部 · 截图此窗口

菜单里的段名就是气泡上显示的段名,如「编码(五笔)」;超过 8 个字截断加 …,没有段名的段 叫「第 N 段」。

取到的是什么:

  • 某段:这一段的内容行,换行连接,不含段名。「编码」段复制得 vbg;「完整原文」段 复制得未截断、未折行的整段原文。
  • 此行:这一行原样,如 好:hǎo/hào。只想要读音的话,把模板改成只输出 ${readings}。
  • 复制全部:整个气泡的文字,格式与气泡上一样([段名] 独占一行),但内容是原文—— 没有截断的 …,也没有折行插入的换行。

上屏的行为:

  • 连同已经确认的部分一起上屏,并结束本次输入(清空编码、关掉候选窗)。
  • 上屏的是提示里的一段信息,不是这个候选,所以不计词频、不参与造词与联想。
  • 菜单开着的时候候选变了(比如这次输入已经结束,或那个位置已换成别的候选),上屏会放弃,并弹出提示 「候选已变化,未执行」。复制不受影响,复制的就是你打开菜单时看到的内容。

如果气泡在你右键前一刻刚好刷新过(例如编码索引在后台建好,前面多出一个「编码」段), 菜单里只剩「截图此窗口」——此时按你点的位置取值会取错段。把鼠标移开再悬停一次即可。

常用配方

下面的片段都写在 config.toml 里。记住写了 sections 就是整表替换:片段里 没有列出的段就不会显示。

只要编码

[[ui.tooltip.sections]]
label = "编码{(${code_source})}"
template = "${word_code}"

出厂内容 + 一行 Unicode

把出厂列表整段复制过来,在末尾加一段:

[[ui.tooltip.sections]]
label = "Unicode"
inline = true
template = "${unicode_all}"

显示为 Unicode: U+4F60 U+597D,整个候选一行。想每字一行,改用出厂那个 Unicode 段 (each = "char"),把 enabled 改成 true。

英文候选显示词典释义

先按注释词库挂好英汉词典,再加一段(设置页「按预设添加」里的「词库注释」就是这一段):

[[ui.tooltip.sections]]
label = "词库注释"
template = "${dict}"

没有释义的候选这一段自动消失,所以中文候选不受影响。与候选注释相比,释义放在气泡里不占候选窗 的宽度,长释义也看得全。

拆字与拼音分开显示

出厂就是分开的,只是拆字段关着。在出厂列表里把「拆字」段的 enabled 改成 true:

[[ui.tooltip.sections]]
label = "拆字"
each = "han"
template = "${char}:${chaizi}{ [${chaizi_code}]}"

想合成一段见上文。

读音只显示最常用的一个

把「拼音」段的模板改成:

template = "${char}:${readings:1}"

学形码:逐字看编码

[[ui.tooltip.sections]]
label = "逐字编码"
each = "han"
template = "${char}:${code_rev_all}"

对词组候选,「编码」段给整词的编码,这一段再把每个字怎么打列出来。

从旧版开关迁移

0.123 之前,悬停提示只有六个开关。升级后它们自动换算成等效的段列表写入你的配置,旧键从 配置文件中移除,气泡外观不变:

旧键换算为
code_enabled「编码」段的开关
pinyin_enabled「拼音」段的开关
pinyin_heteronyms = false拼音段模板改为 ${readings:1}(只取首音)
pinyin_max_readings = NN > 0 且多音字开关没关时,拼音段模板改为 ${readings:N}(多音字开关关了则以 ${readings:1} 为准)
chaizi_enabled拼音也开着:拼音、拆字两段换成一个「拆字 / 拼音」合并段,行序与旧版一致;拼音关着:打开「拆字」段
debug_enabled「调试」段的开关
  • 换算以出厂列表为底,所以老用户同样得到新增的「完整原文」段(开)和「Unicode」段(关)。
  • 如果你的配置里已经写了 sections,以它为准,旧键直接删除、不再换算。
  • 与旧版有三处可见差异:
    • 合并段的标题固定为「拆字 / 拼音」。旧版在所有字都查不到拆字(或都查不到读音)时,会退回 只显示「拼音」或「拆字」标题;内容行与旧版相同。
    • 英文、符号等非汉字候选开始有气泡(见上文)。
    • 自备拆字库里「只有编码、没有字根」的字,现在会多显示编码,如 丂: [gnv](出厂拆字库里没有这种条目)。

平台支持与已知局限

  • 右键菜单只在 Windows 的普通候选窗下可用。开启了宿主代理渲染 的应用里,气泡不响应右键;macOS 版的气泡也没有右键菜单。气泡的内容、截断与折行在各平台一致。
  • 段列表一旦写进你的配置,就定格在那一刻。以后版本新增的出厂段不会自动出现在你的气泡里—— 无论这份列表是你手改的,还是从旧版开关换算来的。升级后想看看有什么新段,对照本页的 出厂列表手工加上,或删掉你配置里的 sections 回到出厂状态。
  • 只有全局一份,不能按方案或输入模式分别设置。
  • 段名可以由主题单独配色(title 角色)0.123 新增,但不能单独加粗, 与内容同一字体。
  • macOS 版的气泡由 .app 自己绘制 0.123 新增。.app 与输入法服务的版本不一致时(新服务配旧 .app,或反过来), 气泡里的分段颜色退化为单色——整段用气泡文字色,内容与排版不受影响。

配置项参考

对应的配置键、取值范围与默认值见外观配置 · 悬停提示。

对这篇文档有疑问,或发现内容有误?

欢迎到文档仓库提 issue,写明问题时附上本页链接即可。

去提 issue →

本页目录