Files
qingjian/docs/design/settings.md
T
Haoyu Xi dd2657e305 feat: 词库导入支持只有词的表,读音按随包词库派生 (#787)
只有词的 txt 与混了无读音行的 Rime 词库以前认不出或静默丢词;现在按随包基础词库与领域词库派生读音,四个导入入口都接上。

Closes #698
2026-10-26 09:50:20 +08:00

24 KiB
Raw Blame History

设置程序的页面与设置项

设置程序 apps/settings 三个平台共用一份,替掉了 macOS 偏好设置和 Windows 设置程序(两者留一个版本作回退);Linux 以前没有设置界面,也用它。 本文定的是:分哪几页、每一项放哪页、页里怎么分组排序、标题怎么写、用什么控件。

原则

  • 按用户想改的事分页,不按代码里的分节分页。 配置文件是 [general] 一大节,以前的「通用」页照搬了这一节,结果什么都往里放。
  • 标题就是说明。 能用一个短语说清的不加说明行。少数必须解释的,放进标题右边的 ⓘ,鼠标悬停(或键盘聚焦)才显示,页面上不出现大段灰字。
  • 一件事只在一处。 以前「打包日志到桌面」「打开日志目录」在「高级」和「关于」各有一份,这次每项只出现在一页。
  • 只在某个平台有的项,在别的平台不显示,不显示成灰的。哪项在哪个平台显示由 src/support/ 的表决定:每项登记三个平台是支持、不适用还是待实现,后两种都不显示。
  • 跟别的设置有依赖的项(比如字体只对青简渲染器生效)显示成灰的,不另写说明;ⓘ 里写清依赖哪一项。

页面

旧的「通用」拆成「输入」「候选」「中英文」三页,旧的「候选窗口」改名「外观」,模糊音和辅码并进「输入」,页数不变(11 页);之后加了「生词本」「实验功能」,共 13 页。

# 页 图标 内容 旧位置
1 输入 键盘 方案、五笔、模糊音、辅码 通用、模糊音、辅码
2 候选 列表 每页几个、译文、繁体、emoji、排序、英文词 通用、高级、云服务
3 中英文 中/英 英文模式、切换键、标点、状态条 通用、候选窗口
4 外观 调色板 预览、主题、排布、文字、动效 候选窗口
5 快捷键 ⌘ 全部可改的键 快捷键
6 自定义短语 引号 短语表格 自定义短语(只 macOS 有)
7 词库 书 随包词库、导入的词库 词库
8 云服务 云 云联想 云服务
9 统计 柱状图 输入量、词汇 统计
10 生词本 卡片 时间线、词表、导出 新加
11 高级 齿轮 配置文件、日志、学习数据 高级、关于
12 实验功能 烧瓶 下载、启用知意与含章·知微(macOS、Windows) 新加
13 关于 竹简 版本、更新、许可、数据来源、隐私 关于

各页

下表里「控件」一列:开关是 Switch,分段是 Segmented,下拉是 Select,步进是 Stepper,勾选是 Checkbox,按键是录键按钮(点一下再按键),文本是单行输入框。 「ⓘ」一列是悬停说明的全文,空着就是没有。

1 输入

方案

标题 控件 配置 ⓘ
拼音 下拉:全拼 / 小鹤双拼 / 自然码 / 微软双拼 / 搜狗双拼 / 智能ABC / 小浪双拼 / 首道双拼 / 拼音加加 / 紫光双拼 / 大千注音 / 关(只用形码) general.scheme 双拼与注音下 v、u、i 是按键,表达式和问字改用 Shift + V、Shift + U 进
输入框显示按键 开关,只在双拼时出现 general.shuangpin_raw_preedit 输入框里显示敲的字母,候选窗口里照旧是全拼
五笔(86 版) 开关 general.wubi 跟拼音同时开就是混输,五笔打全的词排在前面

模糊音:九个勾选,排成三列,拼音关着时变灰:z = zh、c = ch、s = sh、n = l、f = h、l = r、an = ang、en = eng、in = ing(fuzzy.*)。

辅码

标题 控件 配置 ⓘ
启用 开关 aux_code.enabled 拼音打完敲触发键,再敲码筛选候选
触发键 录键(单个不带修饰键的符号,按 is_valid_aux_code_key 校验) general.aux_code_key 微软、搜狗、紫光双拼里分号先当韵母
候选上显示码 开关 general.aux_code_show
码删空后留在辅码 开关 general.aux_code_keep_empty
码表 列表:每行勾选 + 名称 + 条数 + 移除;底下「导入码表…」 aux_code.disabled

辅码关着时下面几行变灰。码表列表单独一组「码表」:随包的(没有「移除」)、导入的,末尾一行导入。 整个辅码只在 Windows 显示:现在只有 Windows 的输入法加载码表,macOS、Linux 的输入法接上码表之前不显示,免得开了没用。

2 候选

显示

标题 控件 配置 ⓘ
每页候选数 步进 1–9 general.page_size
译文 下拉:英语 / 日语 / 西班牙语 / 越南语 / 不显示 general.learning_language 不显示时生词标记也关掉
繁体 开关 general.traditional 只换字形,不换用语
emoji 开关 general.emoji

排序

标题 控件 配置 ⓘ
学习输入习惯 开关 general.learning 关掉后不再学,已学的照样用
本地整句模型 开关 model.enabled 在本机给整句重新排序,不联网

「学习输入习惯」以前在「高级」,「本地整句模型」以前在「云服务」,可它们都在本机运行、改的都是候选顺序。

英文词

标题 控件 配置 ⓘ
打拼音时也给英文词 开关 general.english_in_chinese hello、compa → company;关掉后句末英文词也一并停(nanine 不出「那nine」)
英文候选最多几个 步进 1–4,「打拼音时也给英文词」关着时变灰 general.english_max_in_chinese 1 时只留最靠前的一条
英文词最高排到第几位 步进 1–9,「打拼音时也给英文词」关着时变灰 general.english_min_position 有中文候选时;1 为不限
中文排在英文词前面 开关,「打拼音时也给英文词」关着时变灰 general.chinese_first

3 中英文

英文

标题 控件 配置 ⓘ 平台
英文模式 开关 general.english_mode 关掉后固定中文,要英文就切到别的输入法 全部
切换键 三个勾选:单击 Shift / 单击 Ctrl / Ctrl + Alt + Space shortcut.switch_mode Windows
英文模式也给候选 开关 general.english_candidates Tab 或方向键选词,不选时跟直接打字一样 全部
只在写字的应用里给 勾选,挂在上一行下面 apps.english_candidates_on 浏览器、聊天、文档类应用;名单在配置文件里改 全部
Shift + 字母 分段:交给应用 / 进组句 general.shift_letter 进组句才能打出「C盘」 全部

macOS 的切换键是 Caps Lock,由系统决定,所以不显示「切换键」这一行。

标点

标题 控件 配置 平台
中文标点 分段:全角 / 半角 general.full_width_punctuation 全部
英文标点 分段:半角 / 全角 general.english_full_width_punctuation Windows、Linux
标点先上屏候选 开关,ⓘ:nihao, 一气打完「你好,」 general.punct_commits 全部

状态条(只有 Windows):悬浮状态条,开关,status_bar.enabled。以前放在「候选窗口」页,可它显示和切换的是中 / 英与标点。

4 外观

就是已经做好的「候选窗口」页,换个名字,内容不变:预览,主题卡片,然后分外观、排布、文字、动效四组。改动只有两处:

  • 「拼音显示位置」挪到「排布」组(现在就在那里),ⓘ 写「终端里行内拼音显示不正常时选只在窗口」。
  • 「悬浮状态条」移去「中英文」页。

5 快捷键

翻页与模式

标题 控件 配置
翻页键 分段:[ ] / , . / - = general.page_keys
表达式 分段:v / u / i shortcut.expression
问字 分段:v / u / i shortcut.question
? 也进问字 开关 shortcut.question_mark

候选

标题 控件 配置
上屏第一个译词 录键(按住修饰键再按个数字,记修饰键) shortcut.translation
上屏第二个译词 同上 shortcut.translation_second
翻译选中文字 按键(组合键) shortcut.translate_selection
按需 AI 联想(macOS、Windows) 按键(组合键) shortcut.predict

页底一个「恢复默认」按钮,下面用小字列出组句中固定、不能改的键(空格、1–9、回车、Esc 等),这是全页唯一保留的一段说明文字。

模式键只有 v、u、i 三个能选,选了另一个正在用的字母就两个对调,不报错。 录键:点一下按钮进入录制(显示提示),按下的键能用就写进配置、结束录制;不能用(缺修饰键、跟另外两组修饰键撞了、 翻译键不是字母数字)就在这一行下面说原因、接着等;Esc 或点别处取消。修饰键只按着不算,要再按一个键。 字符键按不带修饰键时的字认(⌥1 记成 ⌥ 加 1),Windows 上 ⌘ 那一位记的是 Win 键。 Windows 旧设置程序里「翻译选中文字」只能改修饰键,这里整组都能录。「恢复默认」不动辅码触发键(它在「输入」页)。

6 自定义短语

每条一行:开关(勾选,标签是输入码)、权重、内容的第一行(太长截断)、「编辑」;末尾一行「新增…」。 新增、编辑在对话框里:输入码、权重(输入框,1–999,新增时 10)、内容(多行,回车换行),「取消」「保存」,编辑时左边多一个「删除」(点两下)。 保存时整张表交给 Config::set_custom_phrases 校验(输入码 1–32 个小写字母、权重在范围内、同码同内容不能重复),不过就在卡片里说原因、草稿留着; 打开编辑后这条在别处被改了,保存不覆盖。Esc 或「取消」扔掉草稿,换页也关掉卡片。 表下面一行开关「也用系统的文本替换」(只 macOS,general.system_text_replacements)。

Windows 和 Linux 以前没有这一页,这次都有了。

7 词库

随包词库:十一本领域词库排成两列勾选(dictionaries.domains),名字去掉统一的「青简领域词库:」前缀,后面跟条数。基础词库一直启用,不列。

导入的词库:每行勾选 + 名称 + 条数 + 许可证 + 移除(dictionaries.disabled);末尾一行「导入词库」,可多选文件。 转换在后台线程(大的 Rime 词库要几秒),每个文件一行结果显示在按钮下面;导入成功的同名词库若之前关过会重新打开。 源文件里有没写读音的词(只有词的 txt / 混了无读音行的 Rime 词库)时走 import::import_dictionary:读音按随包基础词库与领域词库派生, 结果行写明跳过了几条、前几个是哪些词;全带读音的 TSV / Rime 与 .qj 仍走普通导入,行为不变。 移除是挪进目录里的 removed/,不真删;输入法发现文件变了自己重载。清单进这一页时扫一次,导入、移除后重扫。 随包词库的位置:macOS 先找设置程序自己所在的 .app,再找装好的 Qingjian.app/Contents/Resources/dicts;其他平台在随包根的 data/generated/dicts。

8 云服务

标题 控件 配置 ⓘ
启用 开关 predict.enabled 打字时把光标附近几十个字发给下面的服务,密码框里不发
云端词 步进 0–4,0 显示「不要」 predict.slots 补进第一页末尾这几格
自动联想(macOS、Windows) 开关 predict.automatic 关闭后用按需联想快捷键请求
停键等待(macOS、Windows) 步进 100–10000 毫秒 predict.debounce_ms 自动联想关闭时变灰
最短请求间隔(macOS、Windows) 步进 1000–60000 毫秒 predict.min_interval_ms 自动和手动请求共用,缓存复用不联网
整句补全 开关 predict.sentence 按 Tab 采用
生词本整句翻译(macOS、Windows) 开关 predict.vocabulary_translation 打完一句话后单独把这句发给服务,译文记进生词本的时间线;不发光标前后的文字
接口地址 文本 predict.base_url
模型 文本 predict.model
API 密钥 文本(密文),已设置时占位符写「已设置」 predict.api_key 只存在这台电脑的配置文件里,打包日志时会抹掉
连接 「测试连接」按钮,结果显示在按钮下面

云联想关着时「云端词」「整句补全」变灰;地址、模型、密钥照样能填能测,先测通再打开。 输入框回车或离开时才存(离开包括换页),Esc 扔掉没存的改动;密钥框不显示已存的密钥。macOS 以前缺「整句补全」,这次补上。

密钥存哪:三个平台都写进配置文件的 [predict] api_key。macOS 偏好设置以前写在配置同目录的 .env, 可输入法重读 .env 时不覆盖已有的环境变量,换密钥要重启输入法才生效;写进配置文件热加载就生效,Windows 一直是这么存的。 旧的 .env 照样读(设置程序启动时也读进来,好显示「已设置」),配置文件里写了的优先。

9 统计

顶上分段切「输入 / 云服务」两层(不做侧栏折叠:侧栏只为一页多一层展开状态不值);云服务层只在记用量的平台显示(support 表的 ApiUsage)。 两层结构一样,切换时布局不跳、只换数:今天 / 本周(周日起,同 GitHub 的提交日历)/ 本月 / 累计四张数字卡,近一年按天的格子图(一列一周、周日在上,颜色按当天量相对一年里最多那天开方后分四档), 过去 24 小时的柱状图(最右是现在这个钟点;比「今天」好:早上打开不是空的,跨零点的夜里也连着),再下面详情。图表是 bamboo-slip 的 Heatmap / BarChart,悬停浮出说明。 输入层详情:最多的一天、日均、速度(今天 / 平均 / 最快一天,只算键间停顿不超过 5 秒的时间)、首选率、一次打对(上屏前没删过的比例)、平均码长、跟一本书比;末尾是词汇一组 (见过、看熟、上屏过、直接打出过、本周新见一句话,有等级表时一张按级的表)。云服务层详情:最多的一天、请求次数一句、Token 表。 数据由输入法写在数据目录(usage-hourly.tsv 与只读的老 usage.tsv、api-usage.json 与 api-usage-hourly.tsv、user-vocab.tsv),设置程序进这一页时读一次,不写。 --png 截图在最后装一份样例数据(offscreen/sample.rs)拍这两层。 等级表的位置:macOS 在 Qingjian.app/Contents/Resources/levels-<语言>.tsv,其他平台在随包根的 assets/levels/。

10 生词本

照 #570 引用的中英输入法的样子做:按语言分开记,顶上一行分段切「时间线 / 词表」,记过两门以上语言时旁边再一个分段切语言。

时间线(缺省):数据是输入法追加的 vocab-log.tsv,一次相遇一行。 「‹ 日期 ›」跳到前后有记录的日子;大字的相遇次数加「个词与你相遇」;一段话「其中 N 个是你今天第一次见到的生词。已连续输入 K 天」(第一次见到按 user-vocab.tsv 的首见日,连续按输入统计里有汉字的日子); 记忆色带:卡片里统计页同款的柱状图(BarChart),一个钟点一根,悬停浮出「16:00–17:00 · 12 个词」,今天的话现在这个钟点高亮;再下面「今天 N 个词」一组,每条左边圆点,说法大字(日语后面跟假名),中文在下,单个词再带例句,右边「下午 4:53」。每页 50 条。 读音这一列现在只有日语有,留给以后的英语音标;发音以后接系统朗读,不用另存。

词表:数据是 user-vocab.tsv。一句汇总,一组筛选(全部 / 生词 / 本周新见 / 认识了)、排序(最近 / 次数 / 字母)、搜索; 每行分层:译词大字加粗、后面一个带底色的小标签(生词用强调色、认识了灰的),下一行中文,再下一行「例句 …」,最后小字的次数与最近日期,右边「认识了」与「删除」。每页 50 个。 生词本之前记的英语词没有中文,按随包 glossary-zh 反查一个补上显示与导出,不写回。

两个视图末尾都是「导出与清空」:导出列出的词(CSV / Anki / 网页,按词表当前的筛选与搜索)、清空生词本(点两下,连同时间线)。 标认识、删除、清空当场写回;输入法也在写 user-vocab.tsv,两边写之前都先合并对方的改动(VocabularyBook::refresh),输入法每 60 秒落盘时看一眼;时间线输入法只追加,清空时设置程序整个重写。 学习语言关着时这一页只有一句说明。

没做成虚拟列表:整页在一个滚动区里,列表只是页里的一段,按可见范围只建几行要知道列表在页里的位置;按页翻已经够用。

11 高级

组 项 控件
配置文件 在编辑器中打开 按钮
配置文件 打开数据目录 按钮
日志 详细日志(ⓘ:会记下敲的内容,排查完关掉) 开关 general.log_level
日志 打开日志目录、打包到桌面 两个按钮排一行,做完的结果显示在按钮下面
输入日志 记录输入日志(ⓘ:只存在这台电脑上) 开关 general.input_log
输入日志 清空 按钮,第一下变成「再点一次清空」,第二下才清

「复制诊断信息」要输入法进程里的运行状态(当前方案、词库加载情况等),设置程序是另一个进程拿不到,先不放;以后由输入法把诊断信息写成文件再说。

12 实验功能

页首一句说明:还在试用、本机运行不联网、同一时间只用一个。「候选」页的「本地整句模型」关着时再多一句提醒。 每个可下载的模型一组(知意在前,组标题带「推荐」),第一行是模型名,说明行写大小与一句介绍:

状态 控件
没下载 「下载」按钮;另一个正在下时灰掉
下载中 「取消」按钮;下面一行「正在下载 x / y MB」与进度条
解压中 灰掉的「正在安装…」
下载失败 「重试」按钮,下面写原因
下好了 开关 model.name:开了写这个模型,关了写回 tongbian;下完自动打开

知意开着时多一行「档位」(分段:省电 / 均衡 / 准确,model.zhiyi_tier)。 下载同时问 Gitee 与 GitHub 要清单、先答的那边先下,某块失败换另一边(模型仓库 qingjian-team/qingjian-models 的 Release,标签写死在 jobs/model_download/pack.rs), 逐块核对 SHA-256 再核对整个压缩包,解到临时目录后换进用户目录的 models/zhiyi/(Windows 是 int8 ONNX 版 models/zhiyi-onnx/)、models/hanzhang-zhiwei/。关掉窗口下载就停,下次从头下。 Linux 的输入法还没接,support 表登记「待实现」,侧栏不出这一页。

13 关于

  • 顶部:logo、「青简」、版本与构建号、官网和 GitHub 链接。
  • 更新:自动检查(开关 update.check)、渠道(分段:正式版 / 测试版,update.channel)、「立即检查」(后台线程查完写 update.json,结果显示在按钮下面); 有新版时多一行「新版本 x.y.z」带「下载」按钮,下面列更新日志的前几条。自动检查仍由输入法每天做,设置程序打开时读它落盘的 update.json。 本地开发版(-dev)不查,测提示时用 QINGJIAN_UPDATE_VERSION 顶替版本号。
  • 许可:一行「GPL-3.0-or-later 自由软件」。
  • 数据来源:每个来源一行(词库、语言模型、释义表、emoji、英文词表、词汇等级、五笔码表、笔画码表),默认收起,点「展开」才列出来。
  • 隐私:保留现在那段话,这是关于页唯一一段长文字。

日志相关的按钮从这里移去「高级」。

要新做的控件与功能

项 用在
悬停说明 ⓘ(tooltip) 各页
单行文本输入(含密文、占位符、IME 组字) 云服务、短语编辑
多行文本输入 短语内容
录键按钮 快捷键、辅码触发键
列表 / 表格(选中、双击、滚动) 短语、词库、码表
弹出卡片(模态) 短语编辑、清空确认
文件对话框(多选) 导入词库、码表;三平台各接各的系统对话框
折叠组 关于页数据来源
统计用的数字卡 统计
菜单的键盘导航 所有下拉

实施顺序

  1. 只用现有控件的页:输入(触发键与码表列表除外)、候选、中英文、外观、高级、关于。引擎为此加了折行的段落。
  2. 文本输入 + ⓘ:云服务。引擎为此加了输入框(输入法组字、选区、复制粘贴)、悬停说明的浮层、后台线程叫醒窗口。
  3. 录键:快捷键、辅码触发键。引擎为此加了录键按钮,修饰键补上原样的 ⌃ / Ctrl 与 ⌘ / Win,字符键按不带修饰键时的字认。
  4. 列表、文件对话框:词库、码表。文件选择用 rfd(与 Windows 旧设置程序同一个),清单是普通的分组行,没有另做列表控件。
  5. 弹出卡片、多行文本:自定义短语。引擎为此加了对话框(盖住整窗的底加一张卡片)与多行输入框,列表仍用分组行,没做表格。
  6. 统计。到这一步十一页都有内容了。
  7. 搜索:搜设置行、分组标题、勾选项的标题,行里控件上的字(分段的各项、下拉框的全部选项、录好的键),以及 ⓘ 全文,按这个顺序排;记不清标题时搜选项里的字也能找到那一行。 输入时侧栏的导航换成结果,点结果(或回车取第一条)跳到那页,那一行滚进视野、铺一层底色再淡出,Esc 清空。 索引不手写:设置行这些控件建树时自己登记,开始搜时离屏把每页建一遍收来,所以按当前配置藏起来的项(别的平台的、依赖没开的)也搜不到。
  8. 换掉旧设置程序:新程序装进安装包,输入法菜单「设置…」、Windows 状态条的 ⚙、开始菜单与 Linux 应用菜单的「青简设置」打开它。
    • 安装位置:macOS 是 Qingjian.app/Contents/Applications/QingjianSettings.app(独立的 .app,自己的 Dock 图标与名字,open 打开;随包数据从外层 Qingjian.app 读); Windows 是与 Server 同目录的 qingjian-settings.exe(只开一个,第二次启动把已开的带到前台);Linux 是 <前缀>/bin/qingjian-settings 加一个 .desktop。
    • 回退:旧的 macOS 偏好设置(菜单「旧版设置…」)与 Windows 设置程序(qingjian-settings-legacy.exe,任务栏「中 / 英」右键菜单「旧版设置…」与开始菜单「青简旧版设置」)保留作兜底;新版设置为主,缺省打开新版。 新程序打不开时用旧版;某项不生效靠测试拦:config_keys 离屏点遍每一页的控件,变了的键用输入法的 Config 读回核对。
    • ⓘ 可点:悬停仍是短说明,末尾一行「点一下 ⓘ 打开文档」,点了打开官网文档对应的一段(docs.rs 一张表,按页与行标题对到 docs/user/ 的某个标题, 锚点照官网的 headingId 生成)。测试核对表里每一段在文档里真有这个标题、每一行在那页上真有 ⓘ,文档改标题时测试报错。
    • 用户文档的设置窗口总览(docs/user/getting-started/settings.md)按新的页与组重写,别处的「偏好设置 → 通用」这类指路改成新的页名。
    • 「复制诊断信息」还没有:要输入法把运行状态写成文件,留到以后;反馈时先用「高级 → 打包到桌面」。

待定

  • macOS 输入法菜单里的「模糊音」子菜单保留:设置里它已经不是单独一页了,菜单里留着反倒是最快的入口。