Files
qingjian/docs/plan/todo.md
T
yenharvey 4f37e9fd65 feat(settings): 新设置程序的候选页加上小键盘数字(Windows)
#354 只接了旧版 Windows 设置;新设置程序是主入口,按平台支持表只在 Windows 显示,macOS、Linux 记为待实现。文档同步到按键页与设置页。
2026-10-26 11:28:47 +08:00

22 KiB
Raw Blame History

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.qj 29 MB)不进 git,先按发布附件对待
  • ★ 首次运行体验:没有 data/generated/ 时打进包里的样例词库只有几十条,等于不能用;随包数据(词库、LM 表、释义表、emoji) 要有一套发布版并定好体积(现在 dict.qj 3 MB + 领域词库 7 MB + lm.qj 29 MB + 释义表 .qj 39 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.toml license、「关于」页、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 的尺子算召回与误纠率,再决定喂不喂个人敲错表; 整段一处编辑那路仍是逐变体跑整句,长句慢(nihoama 1 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-vN Release + 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) 读选区 → Server request_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、收窗传空,对齐 macOS render;轮次推进、生词满 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_DISABLED compartment 整键放行不组句,IS_PRIVATE / 密码 / PIN 输入范围为私密(组句但不学不记不发云端,ClientMessage::Privacy → Engine::set_private),box 真机验过:Edge 密码框整键放行;InPrivate 网页文本框报 IS_SEARCH 不报 IS_PRIVATE,私密路径只靠单测覆盖;CI 两个 job 都从 data Release 取 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] 分节对它不生效
    • focus_out 的 client_preedit:2026-10-15 改报 true,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