#354 只接了旧版 Windows 设置;新设置程序是主入口,按平台支持表只在 Windows 显示,macOS、Linux 记为待实现。文档同步到按键页与设置页。
22 KiB
TODO
按「从自用到能给别人用」排。勾掉的移到 roadmap.md 对应阶段。★ 是当前建议的优先项。
2026-09-06 状态:核心输入、翻译(中→英 / 日 24.9 万词、英→中 4.5 万词、注假名、修饰键上屏译词、翻译选中文字)、英文模式候选、
自建词库(基础 8.7 万条 + 随包领域词库 11 本 13 万条,含语料挖出的高频词)、多词库与导入 / 移除 / 开关、偏好设置、.qj 容器(启动 50 ms)、
个人 n-gram(二元 + 三元)、词图内敲错边、崩溃不丢、pkg 安装器、README 安装 / 隐私 / 许可都已完成并在自用。
给测试者打包只剩:特殊应用验证(用户自己在各应用里试);签名等 Developer ID 证书。
〇、上线前必须做(不做就不能给别人)
- 词库质量(产品词库已自建,见 roadmap):常用词表只有 5.6 万,语料挖出的 1.57 万高频词已并入(蚌埠 / 台州 / 高铁 / 吐槽 这类补上了),
网络用语目录还空着(
assets/lexicon/04_internet_slang);LLM 标注的多音字读音抽查;挖词过滤已进dict-convert mine(2026-09-07,oov_filter.rs,与原脚本输出逐行一致); LM 表(TSV 48 MB /lm.qj29 MB)不进 git,先按发布附件对待 - ★ 首次运行体验:没有
data/generated/时打进包里的样例词库只有几十条,等于不能用;随包数据(词库、LM 表、释义表、emoji) 要有一套发布版并定好体积(现在dict.qj3 MB + 领域词库 7 MB +lm.qj29 MB + 释义表.qj39 MB + 英文词表 2 MB,pkg 34 MB;可再考虑变长编码); 发布物 = pkg(bundle.sh --pkg),要么 CI 生成数据、要么把data/generated/当发布附件 - 仓库瘦身(2026-09-07 决定:主仓库继续单库、官网独立仓库,不拆代码;要处理的是数据)。
已做:LLM 中间产物
gloss-llm.jsonl(30 MB)/gloss-en-llm.jsonl/pinyin-llm.jsonl移到data/generated/(gitignore),仓库只留导出的glossary-*.tsv与词库源; 历史在同日压成v0.1.0单提交(完整开发历史在本地分支archive/dev-history,不推),所以公开仓库里从没出现过这些文件。 还差:仓库推到 GitHub 后跑一次tools/release/data-bundle.sh,把这三个 JSONL 与data/generated/*.qj传到data预发布 Release(现在只在本机与归档分支里有); 正式开源后若 clone 太慢,再考虑把assets/lexicon+assets/glossary拆成数据仓库,现在不做 - ★ 签名与公证:pkg 安装器、自动注册输入源、版本号 / 构建号已做(2026-09-06,
bundle.sh --pkg); CI 已搭(2026-09-07,docs/notes/release.md):推标签在 macOS runner 打 arm64 + x86_64 两个 pkg、建 Release、生成releases.json,产品数据从data预发布 Release 下载。 还差:Apple Developer 账号的 Developer ID 证书(配齐release.yml头部的七个 Secrets 就自动签名公证)、仓库推上 GitHub 后第一次真跑验证(本机没跑过 workflow)、 官网改成读releases.json(含 sha256 / 提交 / 构建时间的展示)并配QINGJIAN_WEB_TOKEN让发版与文档改动自动触发官网构建、更新检查 - ★ 特殊应用逐个验证(2026-09-07 用户已验:Zed、Terminal 正常;JetBrains 系没装没验):Secure Input(已有检测,验证密码框不组句、不发云端)、iTerm / Warp、VS Code / Electron、
浏览器地址栏、沙盒应用(App Store 版备忘录 / 微信)、全屏游戏;每个记录 preedit 模式建议(按应用的开关已有
[apps]分节, 英文候选按应用关已做,preedit 模式按应用定可以接在同一分节) - 登录后不恢复成青简:2026-09-06 两次开机日志都显示登录后当前输入源是系统拼音 / ABC,要手动切回(进程没崩过,panic 与崩溃报告都是零;
Caps Lock 切 ABC 的系统开关已排除)。怀疑装在
~/Library/Input Methods的 ad-hoc 包每次重装签名变、登录早期枚举没认上;等签名后装/Library再看, 或在--register之外登录时补一次TISSelectInputSource - 卸载与重置:卸载脚本已随包(
uninstall.sh,--purge连数据删,README 有说明,2026-09-06);还差偏好设置里的「重置学习数据」按钮、 配置文件版本迁移(新增键有缺省,改名键要迁) - 许可证定稿(2026-09-07):GPL-3.0-or-later,
LICENSE全文、Cargo.tomllicense、「关于」页、README 一致;名字与 logo 不授权。以后引入 JMdict 要补进署名清单
一、日常输入体验(决定自己会不会一直用)
- 整句转换收尾:语料再补(现在是维基 + LCCC 微博对话,新闻 / 小说体还缺;bigram 只留次数 ≥ 6 的前 300 万对,
wxqcf出 我想去蹭饭 就是「我想 → 去蹭饭」8 次进了表、「我想去 → 吃饭」没进的稀疏问题,简拼把读音放开后这类问题更显眼); 个人 n-gram 已做(二元 + 三元),「按应用分别记」看用起来的效果再说 - 释义兜底收尾:已做(2026-09-06,只对上屏的词库词 / 云端词查,个人释义表
user-glossary-<语言>.tsv);还可以考虑停顿后高亮的候选也查、 偏好设置里看 / 清个人释义表、导入词库时批量预填 - 本地整句模型的结果偶尔赶不上空格(Linux,2026-10-16):FreeBSD 端到端 Plasma · Firefox 的
firefoxliulanqi,修「只认最新请求」前 8 遍里 2 遍、修后 9 遍里 1 遍 按空格时整句还没换上来(上屏「勠」);同一台虚拟机里生成只要 100–136 ms,不是慢。要 Server 的调试日志才看得清时序,见下一条 - Linux Server 的日志级别写死成 info(
main.rs的with_env_filter("info")),配置里的log_level = "debug"不起作用 - 本地整句模型的同步 / 异步结果不完全一致(2026-10-16 用 docs/user 抽的 635 句量:首选一致 629、候选列表完全一致 582,差在第 2 位以后); neural-rescoring.md 记的是 300 句逐句一致。修「只认最新请求的结果」前后都是这个数,不是它引入的;先查是缓存条件还是生成时机
- 候选窗口里超长释义要截断(CEDICT 表时 你 那条能拉到整屏宽;LLM 表已短,仍要兜底)
- 翻译选中文字:译文很长时候选窗口的折行(读不到选区的提示已做)
- 英文模式候选:把数据包的误拼对照表(typos,10 万对)喂进纠正,技术词(kubectl)没有 wordfreq 词频要给底值,两处编辑的纠正
- 全角 / 半角切换,
。与.(-=非组句时的行为 2026-09-15 已定:仍是半角,但改由壳自己插入, 不再靠放行——放行在部分宿主里到不了应用,见candidate-ui.md的标点一节) - 快捷短语(
i前缀):编码 → 短语表,用户可增删 - 问字模式离线版:拆字表(IDS 数据)按部件查字,云端版已有
- 双拼收尾:菜单栏增加方案切换
- 双拼方案数据化:用户在
schemes/<id>/scheme.toml写type = "shuangpin"就是一套方案,可拿内置方案当底子只改几个键(2026-10-20,Linux 未接) - 双拼解码支持同码出多个读音——小浪的
lk(lai / lia)、nm(niang / nen)、dk(dai / dia)、un(en / eng)现在只解第一个,做完去掉every_syllable_round_trips里小浪的四个例外(#129) - 辅码(issue #8,设计见 docs/design/aux-code.md):触发键(缺省
;,与「非拼音键进直输段 / 全角标点」排优先级)与逐键即筛、词级过滤、辅码态隐藏无码词;码表走 Rime yaml 导入(columns必须解析、import_tables跨文件合表、「有词无码」行要报警);码表存独立码索引(两段式查询,别复用词库 Slot); 原生表只带笔画(CNS11643 笔顺 + 大陆序覆盖表dict-convert stroke,艹 3 / 辶 3 / 阝 2);设置界面加「辅码」页(macOS 偏好设置 / Windows 设置程序:触发键、显示码、码表列表、导入);第三方形码表(小鹤形 / 自然码形)不随包,走引导导入- 整句 + 辅码:辅码态现在只出词候选,整句不出(
dongguaxigua;ppph拿不到「冬瓜西瓜」);要做得把码逐字约束进整句词图(设计文档「后续」)。2026-10-20 用户定先不做
- 整句 + 辅码:辅码态现在只出词候选,整句不出(
- 敲错边收尾:敲错四类代价与整段纠错代价 2026-09-12 已在冻结日志(12886 条可评)上扫过,都在峰上,不改(
docs/notes/constant-sweep.md); 个人折扣上限(3)回放从零学分不出好坏,等user-typos.tsv能带进回放(--user-dict)再看; 退格重打(组句内、跨上屏)已进输入日志retype事件(2026-09-12),攒够后先按docs/plan/model-eval.md的尺子算召回与误纠率,再决定喂不喂个人敲错表; 整段一处编辑那路仍是逐变体跑整句,长句慢(nihoama1 ms、更长的几毫秒) - 个人 n-gram 插值常数(λ 0.8 / K 8 / 上限 0.5 / D 0.75)2026-09-12 回放扫过:K 全平,λ 0.7–0.75 与 0.8 差 0.3 个点、带神经重排后无差,封顶 0.7 起掉;保留现值(
docs/notes/constant-sweep.md)。 「挤掉了」要选四次才翻过「给掉了」是 K 与封顶合起来的设计(一次误选翻不过),不是常数没调 - 词库缺高频「代词 + 的」(我的 / 你的 / 他的):2026-09-12 加了短语层
assets/lexicon/phrases.tsv(dict-convert phrases,语料相邻两三词、对话语料里 ≥ 2000 次、 边界规则,5400 条:我的 / 好的 / 不知道 / 有没有 / 那我),品牌词brand.tsv(青简 210);词典词头收不到的这一层以后按同一方法补 - 语料里少的领域词(对齐 / 后端 / 词库 / 候选框):2026-09-12 从日志人工挑 48 条进
assets/lexicon/domain_words.tsv,语言模型走合成计数(docs/notes/domain-words.md); 语料 0 次的(微软拼音 / 悬浮条)按规矩没进,要进得另立白名单 - 中英混杂词与英文专名(2026-09-15):
assets/lexicon/mixed_words.tsv(C盘 / B站 / U盘 / T恤 / A股…,cpan→C盘,youpan→U盘, 可进整句wozaibzhan→我在B站);dict-convert english同编码优先大写专名(Windows ≠ windows),07_display_forms.tsv补 VSCode / Bilibili 等; 产品dict.tsv/english.tsv已更新。句中英文仍只支持句末尾段,见「中英混输」。 - 按输入串记的选择只认字面:已按「候选全拼记一份、查询取两者最大」做了(
user-choices.tsv字面键 + 读音键各一份;读音键只在当前输入是读音前缀且不少于两个字母时参与,简拼不带全拼的选择;英文词位置的仲裁只按字面键) - 已经学进用户词的错读音云端词(
我的 wo di、我的哦 wo di e这类)没有清理入口:偏好设置词库页给「按读音核对用户词」,或一次性脚本 - 正式版前的发布可信性(2026-09-12 外部 CI 检查,测试版先不做):产品数据改不可变 tag 并在仓库锁版本 + SHA(2026-09-16 已做:
data-vNRelease +tools/release/data.lock+data-fetch.sh); 安装包内容验证(pkg / Setup.exe 里词库、模型、许可齐不齐,codesign --verify/signtool verify);cargo deny(许可证 + 来源);.qj读取器越界 fuzz、qingjian-format跑 Miri - 本地整句模型(已进壳并随包发出,见
docs/notes/neural-rescoring.md;加载 12 秒是早期首次 Metal 编译的记录,2026-09-12 装机实测 102 ms,划掉): 重排改了切分时应用里的行内拼音要到下一键才更新;日语 - 个人微调(LoRA 挂在冻结基模上,基模更新后拿本地日志重训):先在 train 仓库验证收益,再验 candle CPU 训练能不能跑通,都过了才进壳
(闲时门禁、加载时合并权重、开关与一键清除);每个模型假设先按
docs/plan/model-eval.md写尺子与基线 - 通变按当前词库重标拼音重训:训练用的旧词库没有 嗯 / 诶 / 囧,字表里也就没有,带这几个字的路径现在整批不重排(
enen靠静态模型出 嗯嗯) - 个人英文词表没有衰减(2026-09-24 发现):用户词频 / 个人英文词 / 敲错表三张表已加牛顿冷却时间衰减
(半衰期 90 天,
--tune decay-days=可调,0 为不衰减),冷却只压排序权重,记录保留、冷满一年才在落盘时清出, 30 天不用的英文词失去「当第一」的资格;自愈出口仍是删候选(0.3 起在候选右键菜单里)走forget_english。 「位置只有两档」另见 #606。 - 日语 emoji 要等有日语输入模式
- 人名输入(2026-10-20 用户群反馈,对照微软拼音):一串拼音像人名时,第一个音节先按姓氏匹配、不当词语查; 首字是「长」「令」「欧」这类时再看第二字能不能凑成复姓(长孙、令狐、欧阳),剩下的按名字常用字表组合。 要两张表(姓氏含复姓、名字常用字频),来源要许可干净;什么时候按人名排、怎么不挤掉普通词要先定,改了排序过回放
二、产品特色
-
释义表收尾:覆盖面再扩(次数阈值降到 100 约 10 万词);JMdict 校对假名与日文词性;等级表(CEFR / JLPT 已随包,见
assets/levels/) 也可做英→中、日→中方向的种子;四六级 / 商务英语词表要先找到许可干净的来源 -
可选复习(Phase 4):输入统计、生词识别、词汇统计(含 CEFR / JLPT 等级分布)已做(2026-09-06);复习容易变成打扰,先不急
-
云联想收尾(Phase 6):密钥进系统密钥库——mac 钥匙串、Windows 凭据管理器(等签名定了再做,ad-hoc 签名每次重装都弹授权;安卓已用 Keystore,见
docs/notes/android.md)、按应用禁用、限流与用量统计 -
个人模型(Phase 7):小 Transformer 实验(有评测门槛),见 roadmap
-
★ 主题与自绘渲染器 spike(2026-09-13 定向,分支
renderer-spike,见 design/rendering.md): tiny-skia + cosmic-text 画一行「青简 hello 🙂 日本語」+ 圆角阴影,Windows / macOS 与原生并排截图,验四条:彩色 emoji(sbix / COLRv0)、 中日字形回退按 locale、字体按需加载(不扫全系统)、灰度抗锯齿观感;首帧耗时与内存不劣于 GDI / AppKit。过了 Windows + macOS 一起换渲染器、主题文件 TOML; 不过退回各平台各自渲染(Windows 走 D2D)。设置程序不自绘。
三、其他平台
- [~] Windows TSF(Phase 5):真机自用中,候选窗已覆盖商店 / 任务栏搜索(
uiAccess+ 自签)。 与 mac 功能齐平尚缺(按价值排;工时=开发+真机验证合计,单人;真机来回是大头):- [~] ① 翻译选中文字
translate_selection(★★★ / 中高 / 1.5–2 天):代码完成,待真机测(2026-09-10)。 新增RequestSelection/Selection{text,rect}两协议消息;DLL 异步只读会话(com/selection.rs,GetSelection+GetText+GetTextExt) 读选区 → Serverrequest_translation(PredictionKind::Translate)→ 自绘候选窗显示译文 → 回车 / 空格替换(回commit走InsertTextAtSelection替换选区)/ Esc 保留; 设置页「快捷键」加了翻译选中文字行(改修饰键)。mac 全绿 + windows-gnu 交叉编译 / clippy 过;沉浸式应用读选区、替换选区待真机验。 - [~] ② 生词「看到轮次」计数
note_displayed(★★☆ / 低 / 0.5 天):代码完成,待真机测(2026-09-10)。dispatch/mod.rs::reconcile_candidates里真正 show 那次按当前页调Engine::note_displayed、收窗传空,对齐 macOSrender;轮次推进、生词满 3 轮毕业。 - [~] ③ 悬浮状态条(★★☆ / 中 / 1.5–2 天):代码完成,待真机测(2026-09-10)。
Server 侧单例,跟候选窗同一条 UI 线程;分层窗合成器从候选窗
surface.rs抽出成ui/layered.rs两边共用,绘制件(主题 / DPI / 深浅)复用; 状态条自己一个窗口类 + 窗口过程(ui/status/):WM_NCHITTEST→HTCAPTION整块可拖、WM_MOUSEACTIVATE→MA_NOACTIVATE不抢焦点、WM_EXITSIZEMOVE把位置写回[status_bar] x/y(GWLP_USERDATA存自身指针)。新增协议ClientMessage::ModeChanged{english}(fire-and-forget), DLL 在update_mode_indicator推模式;Server 据此刷、会话关就收起;双拼方案 Server 从[general] shuangpin知道。配置加[status_bar]分节(enabled/x/y), 设置「候选窗口」页加开关。沿用 GDI 分层窗保持视觉一致,并记住位置。 mac 全绿(+3 状态条分派测试)+ windows-gnu 交叉编译 / clippy 过;拖动 / 记位置 / DPI / 深色 / 盖高 z-band 待真机验。 - [~] ④ 删候选屏幕提示(★☆☆ / 低 / 0.5 天):代码完成,待真机测(2026-09-11)。
Frame加notice: Option<String>(不参与is_empty),dispatch/shortcut.rs::forget_on_page填、handle_key开头清(只活到下一次按键); 自绘候选窗ui/candidates/view.rs画在拼音行下方(淡色小字)。host 测已加。 - [~] ⑤ 任务栏点中/英反同步(★☆☆ / 低 / 0.5 天):代码完成,待真机测(2026-09-11)。
激活时对转换模式 compartment 挂
ITfCompartmentEventSink(com/conversion.rs),OnChange读回NATIVE位、与当前模式不同才翻转 (防回环),顺带刷指示器 + 上报 Server 让悬浮状态条也同步。纯 DLL 改动、无新协议。 - [~] 符号面板:代码完成,待真机测(2026-10-13)。这一版原生画(Direct2D,彩色 emoji),下一版换 qingjian-render; 按键与鼠标同 macOS,入口在悬浮状态条「符」格与托盘中 / 英图标的右键菜单。
- 发版:换 Certum 开源代码签名证书重签(开发全程自签 + 本机受信任根,见
installer/sign-local.ps1)、windows-v<版本>标签与 CI。 - 本地整句模型上 Windows:Server 已接(
dispatch/rescore/,CPU 推理,设置「云服务」页有开关,安装包带data\model),待真机验:每次重排的耗时(前文 + 几条路径一次前向,CPU 上可能几十到一百多毫秒,超了就缩前文长度)、模型加载时间; 应用光标前文已接(DLL 起组句时读、密码框跳过;2026-09-12 真机验过记事本 / Edge / 终端都读得到,Edge 密码框按IS_PRIVATE识别),真机看沉浸式应用读不读得到; 模型单文件.qjm已做(2026-09-12,复用.qj容器Kind::Model,find_model先.qjm再三件套目录,pack model/tools/release/pack-model.sh, data Release 传model.qjm,bundle.sh / qingjian.iss 只带一个文件),待 mac 与 box 真机各装一次验加载与重排; 密码框已按 TSF 规范做(2026-09-12):KEYBOARD_DISABLEDcompartment 整键放行不组句,IS_PRIVATE/ 密码 / PIN 输入范围为私密(组句但不学不记不发云端,ClientMessage::Privacy→Engine::set_private),box 真机验过:Edge 密码框整键放行;InPrivate 网页文本框报IS_SEARCH不报IS_PRIVATE,私密路径只靠单测覆盖;CI 两个 job 都从dataRelease 取model.qjm(已做)。
- [~] ① 翻译选中文字
- Linux Fcitx5 后续(默认面板与手动安装已实现):native Wayland 验证、Server 自绘 / GNOME 位图、神经重排、自动启动与打包;配置同步、跨平台词库
- [~] Linux 双框架(装的时候认 fcitx5 还是 IBus,两个都支持):IBus 前端
apps/linux/ibus已能用—— socket 客户端、按键翻译、D-Bus 层(按键 / 焦点 / 重置 / 面板三样)都通了,对着真 ibus-daemon 验过。还差:- 密码框与私密输入:
SetContentType的映射写了但没验过(测试里 IBus 一次都没调它),要找个真密码框试;验法见 notes/linux-dual-frontend.md - 按应用设置:IBus 这条路上还没拿到应用标识,
OpenSession的app报None,[apps]分节对它不生效 :2026-10-15 改报focus_out的client_preedittrue,preedit 用 COMMIT 模式由框架留在原来的框里(X11); GNOME Wayland 上改在快捷键交给应用前先原样上屏,鼠标换框仍会丢,见 notes/linux-bringup.md安装脚本按已装框架分支安装、Server 的启动策略:install.sh --frontend auto已做,systemd 用户单元qingjian-server.service随装(--enable-service顺手 enable),两个前端共用一个 Server[general] preedit三档在 IBus 面板下逐个真机验(它的面板能力比 fcitx5 弱),坑见 notes/linux-bringup.md
- 密码框与私密输入:
- 设置项的平台缺口(设置程序
apps/settings/src/support/表里标「待实现」的项,输入法接上之前设置里不显示;测试逐条对照这里):- 辅码:Linux
- 形码与自定义方案:Linux
- 默认英文模式:macOS
- 按应用记住中英模式:macOS、Linux
- 中文与英文、数字之间自动加空格:Linux
- 横排时 ↑ / ↓ 展开成多行:Linux
- 额外翻页键:Linux
- 高亮移动键:Linux
- Ctrl + . 切换全半角标点:Linux
- 双拼键位提示:Linux
- 拼音行显示声调:Linux
- 实验功能(知意、含章·知微):Linux
- 小键盘数字:macOS、Linux
四、其他输入方案
- 五笔(86 版):方案与分期见 wubi.md,第一期 Core + CLI + Windows;
[general] scheme收敛与配置迁移一起做(顺带解掉〇里的「配置文件版本迁移」) - 自定义形码方案:Core / 平台 / CLI / Windows / macOS / 新版设置程序已做(2026-10-20,见 wubi.md 五之三), 剩 Windows 与 macOS 真机验顶字和满码自动上屏、Linux 壳接形码
- 复杂方案收尾(与上一条共用「输入方案」抽象):注音只在 Core 与 Windows 接了,macOS 侧还没接;双拼的方案切换要等
[general] scheme