Jia Sui
|
fdc7ece0ec
|
fix(server): 模型 id 留空时回退到内置包
症状:两个开关都开、模型也在盘上,候选里没有万象。根因是
sentence_collocation_model 为空——全仓只有 ime_config.cpp:497 一处读、没有任何
地方写,ResolveCollocationModelPath 收到空 id 直接返回空,下一行把路径清空,
词典层拿空路径静默降级。配置注释和 69885e9a 的提交信息都写着「模型 id 由设置页
下载器写回」,下载器从未实现这一步。
没有按原设计实现写回:模型就绪后下载按钮是禁用的,已下好的用户无法重新下载来
触发那次写回,照做还得再加一条启动迁移路径。改为空值即内置包——该键没有第二个
生产者(设置页不写、也没有第二个模型包可选),回退后下载到位自然生效,少一个跨
进程写入点和一次迁移。
kDefaultModelId 落在 collocation_model.h,下载器与解析侧共用同一份 id。同步修正
ime_config.h、ime_config.cpp 与两份 config.toml 里「由下载器写回」这个已不成立的
注释。
验证:格式与 Server/Settings 构建通过。运行时未验——当前已装版本不含本改动,但
手动把 config.toml 的该键填成 wanxiang-lts-zh-hans 在旧版同样生效(解析侧读的就
是配置值),重启 Server 即可确认诊断。
|
2026-10-02 20:15:39 +08:00 |
|
Jia Sui
|
e1a664a194
|
fix(server): 万象下载器改用格式锁,撤下无依据的评测宣称
锁定值与上游实际资产不符(字节数 409719852 vs 409412652,摘要 ae43724a… vs 873cbbb3…),下载在字节锁处失败。上游 LTS 会被原地重传且无不可变资产 URL,摘要硬锁意味着每次重训都要改代码发签名安装包,否则全用户下载失败,这个成本消不掉。
改为锁格式:删字节数常量,总长取响应 Content-Length 并在收完后比对一次(截断检测);新增 ValidateFormat 让引擎读取端自己开一次(魔数 + 双数组边界,不按文件自带长度做堆分配)。摘要不再参与放行,只判断 reviewed 并写入旁挂 .sha256(状态查询要频繁调用,不能每次重算 400MB 哈希)。真实上游字节按 open() 判据复核精确贴边通过:array_size=102353152,收尾正好在 409412652。
kReviewedSha256 保留旧值,摘要不符即 reviewed=false,设置页明示「上游已更新,未经评测」,NOTICE 记录实际摘要与字节数并附差异说明。契约无需重生成:sentence_collocation_model_status 是两个宿主各自拼的 ad-hoc JSON,不在 schema.json 内。
撤下无法验证的宣称:设置页删掉「评测 top1 +6 个百分点」(仓里没有评测工具、没有 docs/research,该数字无法复现),改为描述机制;清掉两处对从未进仓的文档与工具的引用(docs/research、tests/src/gram_reader、eval_lm_compare);修正 octagram_gram.h 里被本次改动失效的「摘要校验在下载侧做」。配置只改注释、未增删键,五件套映射不适用。
|
2026-10-02 20:15:39 +08:00 |
|
Jia Sui
|
69092b9d9a
|
feat(server): 万象模型的配置链路、模型包解析与按需下载
- [association] 新增五键:sentence_collocation_additive/rerank(设置页开关,默认
关)、sentence_collocation_model(模型包 id,下载器写回)、两个权重(配置文件
高级项,不进设置页);出厂模板与工作配置同步更新,通过五件套映射下发
- 模型包确定性布局 <DataDir>/models/<id>/<id>.gram,解析只是一次 stat;开关开
着但文件缺席即视为关闭,词格静默降级
- collocation_model.{h,cpp}:WinHTTP 按需下载(重定向放行、进度回报)+ BCrypt
SHA256 校验 + 同卷原子落位 + CC-BY-4.0 NOTICE。SHA256/字节数在常量里钉死:
上游 LTS release 会被原地重传,换字节必须显式更新并复跑离线评测
- CandidateSource::Collocation 落库/学习判定与神经整句同类,候选徽标〔万象〕
- 下载器编译进 Server 与独立设置进程两个宿主,状态以磁盘为准
|
2026-10-02 20:15:39 +08:00 |
|
fanlusky
|
79b0bf3aaa
|
feat(server,ui-html,installer): 回车上屏英文入库加开关
设置页「输入」新增「回车上屏英文时入库」开关,对应 input.enter_learns_english_word,默认开启保持原有行为。关闭后回车仍上屏英文,但不再写入英文词库。
|
2026-10-02 18:45:08 +08:00 |
|
fanlusky
|
45c473158a
|
feat(engine,server,windows,ui-html): 双拼预编辑可显示转换后的全拼
外观里行内预编辑与候选窗预编辑各加一个「双拼显示转换后的全拼」开关,默认关闭。
开启后在双拼方案下:行内原始按键显示不带分词符号的全拼,拼音分词显示带分词符号的
全拼;候选窗显示带分词符号的全拼。
- 引擎新增 get_shuangpin_preedit_forms,同时给出原串切分与全拼切分,不受
shuangpin_preedit_mode 影响。
- 原始按键样式下 TSF 不等 Server 回包,开关开启且为双拼时 Server 下发的实际样式
改为 pinyin,回包里再按用户样式去掉分词符号;换方案时重新下发。
- 转换后字母数与按键不再对应,Server 在预编辑末尾附光标映射表
(engine/contracts/preedit_caret_map.h),DLL 用它定位光标和处理方向键,
无表或长度不符时回落到原有字母映射。
|
2026-10-02 16:14:50 +08:00 |
|
fanlusky
|
c280634c2a
|
fix(engine,server): 词库切到 WAL,避免调频写入阻塞按键线程
选词后的调频写入在词库写线程上提交 msime_user.db / msime.db。两个库都是
默认的 rollback-journal 模式,提交时持独占锁并 fsync,按键线程此时读同一个
库(引擎查询、apply_fixed_positions)就得等完整个提交。磁盘忙或杀软扫描
-journal 时单键可达 0.7~1.1 s,后续按键排队;排队期间按空格/数字会超过 TSF
300 ms 的上屏回复等待,组合被当作传输失败丢掉,表现为输入消失。
- 用户日志库每次建连接时切到 WAL;msime.db 在每次创建输入会话时切到 WAL
(安装升级会换上非 WAL 的新文件)。WAL 下读取看到最近一次提交的快照,
不再等写锁。安装器已保留 msime_user.db-wal/-shm、替换词库前删除旧的
msime.db-wal/-shm。
- ensure_schema 的 PRAGMA user_version=3 本身是写操作,版本已一致时跳过,
建连接不再被其他写者阻塞。
- 新增回归测试:两个库都被写事务锁住时,读取须在 1 s 内返回提交前的内容。
本地用真实词库加锁测量:被锁时首键 769 ms -> 0.5 ms,
apply_fixed_positions 810 ms -> 0.4 ms。
|
2026-10-02 14:57:31 +08:00 |
|
fanlusky
|
31241d22ed
|
fix(engine,server,windows): 句中辅助码支持光标在句中插入,上屏按不带约束的排序调频
光标用箭头或 Ctrl+箭头移回句中后敲反引号,TSF、Server、引擎三处都要求光标在串尾,
反引号被当成标点,光标前的预编辑连同「·」一起上屏。改为只看光标前的部分:光标前是
完整的两键音节就收,落在音节中间或已有段的前面不收。形状规则新增
FanyImeMidSentenceHelpcode::AcceptsMarkerAt,三处共用;引擎的光标插入路径同时接受
句中的第一码和大写第二码。
句中辅助码筛过的列表里,要的词往往已经排第一,选第一个不调频,调了也是在筛过的列表
里排位,下次不敲辅助码时排序不变。现在带句中辅助码上屏词库候选时,改用去掉约束后的
候选作排位参照,选的是第一个也照样调;空格、数字键、鼠标点选都走 ProcessSelectionKey,
引擎自己的上屏路径同样处理。
|
2026-10-02 12:43:16 +08:00 |
|
fanlusky
|
3a7adb6f1a
|
feat(server): 日期时间混入候选,混输查询合并到同一条线程
- 新增 MixedCandidates(src/mixed/):英文、emoji、颜文字、日期时间共用一条后台线程,
按一次输入查完、一次回调交回任务线程合并,候选窗每个按键最多因混输刷新一次。
删除 EmojiIme / KaomojiIme;EnglishIme 只保留英文状态、Shift+Y 和候选译文
- 日期时间混入候选:全拼 / 双拼下整串是 rq / riqi / date、sj / shijian / time、
xq / xingqi / week(双拼按方案换算后的整拼也算)时,首个格式排在首个中文候选之后、
云 / 英文 / emoji 之前,其余追加在末尾;选中直接上屏,不调频、不能固定或删除
- 新增 utility.mixed_candidates(候选混输总开关,默认开)与 utility.date_time_candidates
(默认关);总开关关掉后英文、emoji、颜文字、快捷短语、日期时间都不混入,各自的值保留。
两份配置模板与两个设置宿主同步读写
|
2026-10-02 03:39:23 +08:00 |
|
fanlusky
|
cec3118324
|
feat(engine): 新增日期时间混输候选来源
CandidateSource 末尾追加 DateTime,标记全拼 / 双拼里由 rq / sj / xq 等唤醒词混进普通候选的
日期、时间、星期;Shift+T 模式里的同一批文本仍记 Generated。快捷短语槽位计数不把它算作普通候选。
|
2026-10-02 03:39:13 +08:00 |
|
fanlusky
|
fae80660c1
|
feat(engine,server,windows,ui-html): 双拼句中辅助码
在完整音节后敲反引号,接着的字母筛这个音节上的字:第一码大小写均可,
紧跟的大写字母是第二码,之后可以接着打,一个输入里可以有多段。开关
helpcode.shuangpin_mid_sentence_helpcode 默认关闭。
约束在整句解码时生效,而不是解完再筛:
- Google 解码器在 add_char_qwerty 里送 extend_mtrx_nd 之前按约束过滤词条,
锁住的字带着上下文重新整句解码;约束变化时整段重解,不污染增量搜索。
- kenlm 词格建图时按约束筛边,受约束的跨度不截断地查词库;神经重排只在
词格 n-best 里挑,自动满足约束。
- 普通词条、云和 AI 候选按同一规则收尾校验;满足不了就不出整句。
反引号段在请求里换成手动分隔符,原串留给宿主回读与预编辑显示;选词推进
时剩余音节上的约束随原串保留。输入形状规则放在 contracts/mid_sentence_helpcode.h,
TSF、Server、引擎共用,新增 Worker opcode MidSentenceHelpcodeChanged = 28。
googlepinyinime-rev 已与上游解绑,AGENTS 与 UPSTREAM.md 同步说明。
|
2026-10-02 02:20:37 +08:00 |
|
fanlusky
|
3f430cd68e
|
fix(server): 双拼辅助码开启时快捷短语奇数长编码不再被拦掉
双拼开着辅助码时,「完整音节 + 一个字母」的编码(如 dia = di + a)会被认成带辅助码,
快捷短语混排见到辅助码就直接退出,这类编码的短语永远进不了候选。整串精确等于用户编码时
按短语处理,Server 的 PlaceQuickPhrases 与引擎的 quick_phrase_code 一并去掉辅助码判断,
并补双拼 dia 的回归用例。
|
2026-10-01 02:35:55 +08:00 |
|
fanlusky
|
b314dac8e9
|
feat(server): 扫描皮肤时跳过安装包留下的 .bak 备份目录
|
2026-09-30 23:58:11 +08:00 |
|
fanlusky
|
100d93e472
|
fix(server): 混输英文按学到的槽位排序,补全词默认放首页末位
NormalizeMixedCandidateOrder 去掉按权重跨词库提升英文的逻辑,改为读取 EnglishPlacement:
- 有学到的槽位时,首个英文候选放到该位置
- 输入能读成拼音时优先让精确匹配占槽位,没有精确匹配时由最前的补全词占槽位,默认放在首页末位
- 选中占槽位的英文时前移,越过它选择后面的候选时后退;手动置顶把槽位设为 0
|
2026-09-30 22:49:27 +08:00 |
|
fanlusky
|
bc5ec02c6d
|
perf(server): 神经重排结果到达时只失效整句缓存
ApplyRescoredOrder 原先调 reset_cache:它先清空全部缓存并自己冷算一遍候选,
随后这里又 recompute 一遍,每次重排都多一次冷查询,下一键也跟着变冷。
改为经 IInputSession::reset_sentence_cache 只清整句那层,再算一遍。
|
2026-09-30 19:58:18 +08:00 |
|
fanlusky
|
ec00892121
|
feat(server): 新增仿微软拼音的内置皮肤 microsoft
- 候选窗:深色 #2C2C2C 底、#383838 选中底、#E183D9 紫色选中条,序号与候选同字号,
横排每项最小 4.35em、间距 0.28em(换行的行间同样隔 0.28em);尺寸均按字号缩放
- 翻页:默认开启,实心圆角三角,与候选行等高,横排前加分隔线
- 悬浮工具栏沿用默认页面,拖拽条改为紫色
- ui:PagerArrows 新增 Glyph::Triangle 与分隔线,三角用单一路径填充,半透明时不出现描边重叠;
CandidateList 新增 minItemWidth 与 selectedBarInside
- 设置页新增皮肤卡片与预览;更新内置皮肤列表、文档与配置注释,补充测试
|
2026-09-30 17:35:38 +08:00 |
|
fanlusky
|
9f5572c525
|
fix(build): 所有 MSVC 目标显式按 UTF-8 编译源文件
#548 修了 ngram,同类问题还有几处:源文件或头文件是无 BOM 的 UTF-8,
目标却没有 /utf-8,在代码页 936 的系统上注释会吞掉换行。
- ui:Controls.h 让 msimeui 与各 demo 单独构建失败,/utf-8 设为 PUBLIC
- server/tests/portable:input_key_policy.h 让 MSVC 构建失败
- engine test_windows_ipc_contract、tests/pipe-probe、windows/tests:C4819
- windows DLL:此前只靠 fmt 的 INTERFACE 选项带来 /utf-8,改为显式设置,
否则 L"“" 等宽字符标点会在去掉 fmt 后静默变成乱码
|
2026-09-30 15:37:13 +08:00 |
|
Lu Fan(SonnyCalcr)
|
03911aab61
|
Merge pull request #547 from ouchihao/codex/fix-505-tray-menu-placement
fix(server): keep tray menus inside the icon monitor work area
|
2026-09-30 15:09:25 +08:00 |
|
fanlusky
|
8c2a177a80
|
fix(server): 托盘菜单延迟弹出时保留右键时的图标位置
图标矩形改由任务线程在读完管道数据后立刻取下,随 WM_LANGBAR_RIGHTCLICK 的
lParam 传给菜单宿主。WebView 就绪后补发的消息 lParam 为 0,沿用已保存的锚点,
不再从已被按键和候选窗移动改写的 Global::Point / Keycode / ModifiersDown 重读。
|
2026-09-30 14:57:45 +08:00 |
|
fanlusky
|
dde06afd7f
|
feat(server): 候选框显示翻页箭头并接入设置页预览
- D2D:横排在候选右侧多一窄列,竖排在最后一行下方、「‹」与序号左对齐;开关或排列方式变化时重建场景
- WebView2:页面按 data-page-arrows 显示箭头,点击经 candidatePage 翻页
- 箭头点击走 WM_PAGE_CANDIDATE_ARROW,不受鼠标滚轮翻页开关影响;页面快照带上一页 / 下一页可用状态
- 两个设置窗口宿主下发内置皮肤的 page_arrows,外部皮肤条目带解析后的 pageArrows
- 安装包把 skins/default 以 onlyifdoesntexist 放到数据目录,升级不覆盖用户改过的清单
|
2026-09-30 12:42:25 +08:00 |
|
fanlusky
|
4582550862
|
feat(skins): 内置皮肤抽出为 skins/default 设置清单并支持 page_arrows
五个内置皮肤各有一份 skins/default/<id>/skin.toml,承载皮肤级开关;
[candidate_window] page_arrows 控制候选框翻页箭头,出厂与缺省均为关闭。
外部皮肤可自行设置,不写时沿用 base 对应的默认清单。
皮肤扫描跳过 default 目录,且不允许用它作外部皮肤 ID。
|
2026-09-30 12:42:24 +08:00 |
|
Ouchihao
|
b2719cd0aa
|
fix(server): keep tray menus inside the icon monitor work area
|
2026-09-30 02:54:39 +08:00 |
|
Ouchihao
|
d867037308
|
fix(server): explain duplicate quick phrase conflicts
|
2026-09-30 02:22:35 +08:00 |
|
fanlusky
|
52041513b2
|
fix(server): 杨柳青横排翻译贴底、行尾留白且末项高亮不铺满
行高里的底部内边距原先夹在候选与翻译之间,改为放在翻译下面。
卡片为防闪烁保持同一输入下更宽的尺寸时,多出的宽度均分给同一行各项,末项高亮贴到卡片右边。
|
2026-09-30 01:33:47 +08:00 |
|
fanlusky
|
2b7cd6a96f
|
fix(server): D2D 候选配色支持 #rgba 并拒绝含非十六进制字符的颜色
|
2026-09-29 22:43:52 +08:00 |
|
fanlusky
|
7ad6a42f12
|
feat(server): 外部皮肤新增细分配色、菜单、外框线宽、高亮圆角、阴影与字体族
|
2026-09-29 22:08:00 +08:00 |
|
fanlusky
|
f1b6622ac5
|
fix(server): 候选配色按 CSS 颜色字符过滤,WebView2 候选文字色生效
候选配色此前只按字符串读取就拼进 WebView2 样式表,含 ; 或 } 的值能跳出声明改写候选窗;改用与工具栏相同的 ReadCssColor 过滤。WebView2 的 .text 读 var(--cand-text),皮肤的 text 只设在 .container 的 color 上不起作用,现在同时写入 :root 的 --cand-text;设置页的候选文字色仍以内联样式优先。
|
2026-09-29 21:56:14 +08:00 |
|
fanlusky
|
e3eb9fc9d8
|
feat(server): 快捷短语混入候选默认关闭
|
2026-09-29 19:19:51 +08:00 |
|
fanlusky
|
30e10fc887
|
fix(server): 五笔纯汉字导入忽略用户自造单字码并放行扩展区汉字
- 取单字码时排除用户词库日志里 user_inserted=1 的单字行,出厂码优先;
自造码只给出厂码表里没有的字兜底
- 五笔路径不再沿用 cpp-pinyin 的 U+4E00–U+9FFF 限制,扩展 A、兼容表意字
及 2/3 平面扩展区都可导入
|
2026-09-29 18:56:14 +08:00 |
|
Jia Sui
|
81ca402936
|
test(server): 修复临时目录隔离与真实词库污染
三件事:
1. 临时目录加 PID 后缀并在析构时删除。原先 msime-empty-hans-import 是固定名
且从不清理;固定名在并行 ctest 或多个工作树同时跑时会互相删掉(同样的
理由见 test_caret_prefix_input_session.cpp:27)。
2. 修复上一提交的端到端用例污染用户真实词库。ScopedDataDir 原来只调
SetEnvironmentVariableW:server 的 get_ime_data_path() 走
GetEnvironmentVariableW 读 Win32 环境块,重定向确实生效;但引擎的
data_file_path()(default_user_db_path 用它)走 _wdupenv_s 读 CRT 自己
那份副本,看不到新值。于是 record_user_insert 仍然写进
%LOCALAPPDATA%\metasequoiaime\msime_user.db——实测写入了 3 条
环境/计算机/诸葛亮。改为两处环境变量都写。
验证:跑测试前后各取一次快照逐行比对,944 -> 944,0 增 0 删(文件字节有
变化,是 SQLite 页复用,不是数据写入);端到端用例断言 count==3 也只有在
读临时库时才成立——真实库有 4 条 wubi 行,多出来的那条是用户自己导入的。
3. 补 WubiPhraseCodeRejectsCharsWhoseCodeIsShorterThanTheRuleNeeds,锁住上一
次提交的短码防御;同时修正我先前写错的一条断言——4 字以上每位只取 1 位,
1 位码够用,守卫不该误伤长词。
|
2026-09-29 18:44:53 +08:00 |
|
Jia Sui
|
65ff492611
|
fix(server): 五笔取码拒绝不足位的短码
code.append 按 full.size() 截断。某个字只有 1 位码时,2 字词会拼出一个 3 位
key 填 4 位槽:它能查得到、能上屏,但永远凑不满 has_complete_code() 要求的
4 位,还会以合法词码的形态留在 wubi86 里,成为一条永远选不中的垃圾词条。
出厂词库的有效最短码长是 2(20004 个字 4 位、1581 个 3 位、1 个 2 位),
所以当前数据下不可达。这是给已经进了公共头的函数补一道防御:词库一旦变动,
不必等某个用户导出一份名单才发现导入静默产生了废码。
单字走 npos「全取」分支,不设长度下限,1 位码原样出码。
|
2026-09-29 18:44:53 +08:00 |
|
Jia Sui
|
e3086f4985
|
test(server): 补五笔纯汉字导入的端到端用例
上一提交只验证了取码纯函数与 importHans 的分发路由,没有验证「导入真的能写
进去」。这轮补一个针对真实 TU 的端到端用例:在临时目录建一个只含 wubi86 表的
msime.db(种子单字码与取码用例一致),把 METASEQUOIA_IME_DATA_DIR 指过去,
再走 HandleRequest 完成一次真实导入。
覆盖此前未验证的验收项:
- 规则推出的码与权重 30 确实落库,而不是拼音的 10000
- record_user_insert 落到用户词库,「导出五笔用户词库」才收得回这些词条
- 非法行(非汉字、码表缺字)计为失败并带行号,且不中断整批
- 重复导入判为已存在,不产生重复行
写测试时踩到两个自己的错误假设,都由用例本身暴露:
- 「观」在出厂 wubi86 里其实有码(cmqn),不能用它演示缺码
- 重跑一批(含失败行)时 ok 为 false 是 SummarizeImport 的既有语义
inserted>0 || (failed==0 && skipped>0),与拼音路径一致,不是缺陷
全临时目录,不触碰任何真实词库。
|
2026-09-29 18:44:53 +08:00 |
|
Jia Sui
|
301944a2dd
|
feat(server,ui-html): 五笔词库支持纯汉字词组批量导入
设置页词库管理新增「批量导入纯汉字词组到五笔词库」,把一份纯汉字名单
(人名、地名)直接变成五笔可打出的词条。
取码按 86 词组取码规则从 wubi86 单字码组合:2 字取首/次各 2 位,3 字取首/次
各 1 位加末字 2 位,4 字以上取首/次/三/末各 1 位。规则不是猜的——拿出厂词库
反推拟合,62601/62636 = 99.94% 命中;未命中的 0.06% 是作者为避重码手工改过
的词,正是规则正确的证据。单字保持自然码长不补 z,否则「节」会同时存在 abj
与 abjz 两条重复词条。
wubi86 没有 value 首列索引,逐字查码是全表扫描(实测 3.38ms/字,2000 字名单
要 6.8 秒),因此一次性把单字行读进内存(约 25ms)后纯内存查。
缺省权重按词库区分。实测拼音 2 字词 p50=2805/max=9931703,五笔 p50=10/max=110:
同一个 10000 落在拼音 p50~p60 的合理区间,搬到五笔则是全库 max 的 91 倍,
导入的词会碾压原生词条。拆出 kDefaultPinyinImportWeight=10000 与
kDefaultWubiImportWeight=30,ImportWubi 同步改用后者——这是行为变更。
顺带把四份逐字重复的导入结果汇总块收口为 SummarizeImport。ImportQuickPhrase
刻意留在外面:它原本不调 NotifyImeServerClearDictCache(快捷短语不由活动输入
会话消费,缓存失效对它无意义),一并收口会凭空加上这次调用。
协议零改动:importHans 与 wubi 都已在契约枚举内,因此不触碰 engine/contracts/
与 ui-html/webview2/shared/ 的生成物链条。
测试新增 7 个用例,覆盖四种取码规则、单字码长、缺字失败、权重刻度,以及
importHans 的分发路由——路由链的是真实 TU,用空数据目录让三条分支都在写库
前返回,因此不碰任何真实词库。
|
2026-09-29 18:44:53 +08:00 |
|
fanlusky
|
f8a83d28d1
|
fix(server): 扩大 Main 管道入站缓冲
原 4 KiB 只容得下 13 帧,TSF 端突发写入时容易被拒绝并触发重连。
提高到 128 帧,为宿主的密集事件留出余量。
|
2026-09-29 15:47:49 +08:00 |
|
fanlusky
|
2415da274f
|
feat(server): 候选中混排快捷短语并参与调频
- 全拼 / 双拼(非五笔、无辅助码、非造词)编码精确匹配时,把快捷短语组放到固定位置候选
之后,翻页扩展时重新放置;Shift+K 模式不变
- 新增 utility.quick_phrase_candidates(混入候选)和 utility.quick_phrase_frequency
(参与调频),默认都开,utility.quick_phrase 仍只管 Shift+K;两份配置模板与两个设置宿主
同步读写
- 选中快捷短语或越过它选普通候选时异步写入槽位,K 模式里的选择不学;英文最高权重提升
忽略快捷短语
|
2026-09-29 14:31:51 +08:00 |
|
fanlusky
|
c9b86e0026
|
feat(engine): 支持用户自定义双拼方案
用户在数据目录 shuangpin\custom\ 下放 TOML 文件,在设置页以 custom/<文件名>
选用。零声母规则从 o、a、first_letter、full_pinyin 四种里选,声母和韵母
映射由文件指定,可用 [zero_initials] 覆盖个别零声母音节。
- 引擎:新增 CustomShuangpinLayout 与 BuildCustomShuangpinProfile,校验缺键、
声母撞键,并对全部音节做往返解码,冲突时给出可读的错误信息;新增运行时
方案注册表,按需加载。
- Server:扫描并解析自定义方案,配置快照带上方案列表与目录;文件缺失或无效
时回退到小鹤。
- 设置页:仿照自定义辅助码,新增打开目录和刷新按钮;无效方案列出但禁用,
悬停时显示错误。
- 安装器:覆盖安装与迁移数据目录时保留 shuangpin 目录。
- 文档:docs/custom-shuangpin.example.toml 提供带详细注释的示例。
|
2026-09-29 11:33:23 +08:00 |
|
Lu Fan(SonnyCalcr)
|
4042a503be
|
Merge branch 'develop' into fix/voice-keep-composition
|
2026-09-29 04:06:53 +08:00 |
|
fanlusky
|
78f8bd6174
|
fix(server): 语音已定句子不再提前上屏,保持 TSF composition 连续
#524 在句子判定后立即提交上屏,会结束当前 composition,把一段话从中间截断。
撤回逐句提交:录音期间整段识别文本始终留在同一个预编辑里,松键时再整段提交。保留按静音分句(end_window_size / force_to_speech_time),让已说完那句的标点在按住快捷键时就能出现在预编辑中。
|
2026-09-29 03:55:31 +08:00 |
|
fanlusky
|
f56551c34b
|
feat(engine): 内置搜狗、紫光、智能ABC、国标和拼音加加双拼方案
新增五套双拼方案表,零声母规则:
- 搜狗、紫光、智能ABC:o + 韵母所在键
- 国标:a + 韵母所在键
- 拼音加加:韵母第一个字母 + 韵母所在键
搜狗和紫光与微软一样把 ing 放在分号上。分号作韵母键原先按方案名写死为
microsoft,现改为 ShuangpinProfileUsesSemicolonFinal 按方案表判断,
引擎、Server 按键处理和下发给 TSF 的开关一并生效。
智能ABC 键位图把 ve 也标在 V 上,但这样 lv/nv 会同时解成 lü 与 lüe,
这里按标准智能ABC 把 ve 放在 M(与 ue 同键)。
Server 配置校验改为按方案解析结果判断;设置页下拉框、配置模板注释和
README 同步更新;新增各方案键位、零声母、分号及全方案逐音节往返测试。
|
2026-09-29 03:52:19 +08:00 |
|
fanlusky
|
1794aa8741
|
fix(server): 切换到其他输入法时前台线程的停用不再因路由归属被丢弃
路由被 TextInputHost、任务栏或后挂起的线程占着时,前台应用切走输入法发来的
终止停用会因为不是路由所有者而被静默丢弃,g_is_ime_active 保持为 true,
悬浮工具栏不隐藏。现在来自前台窗口(或其焦点窗口)所在线程的终止停用会退役
残留路由并推进 epoch,照常投递 ClientDeactivated;后台线程仍被忽略。
|
2026-09-29 03:18:58 +08:00 |
|
fanlusky
|
338b8bf7c2
|
feat(server): 豆包流式语音按静音分句,已定句子在录音中即时上屏
此前请求沿用默认语义分句且不返回 utterances,最后一句要到音频结束(松开快捷键)才判定并补上标点;Server 也只在 Finish 之后整段提交。
改为按静音分句(end_window_size=800ms、force_to_speech_time=1000ms)并开启 show_utterances,从中解析已判定的句子前缀。行内预编辑模式下,句子一经判定即提交上屏,剩余部分继续作为预编辑;松键时只提交未上屏的部分。配置了文本润色时仍在松键后整段提交。
|
2026-09-29 02:57:05 +08:00 |
|
fanlusky
|
738435b002
|
fix(engine): 全拼长句不再为更短的前缀补 Google 整句
前缀查不到词时 query_single_path 会补一条 Google 整句,长句候选后面于是缀上一串越来越短的〔Unigram〕子串。整句联想只对完整输入出一句,前缀只取词库里的词,查不到就交给更短的前缀。
|
2026-09-29 02:22:57 +08:00 |
|
fanlusky
|
995174af47
|
feat(server): 造词时 Esc 可只清除未选拼音、保留已选词
新增 input.escape_keeps_selected_word(默认 false)。开启后,造词中按 Esc
只清掉还没选的拼音,保留已选的词,候选窗只显示该词作为 preedit;
再按一次 Esc 整体取消(小狼毫风格)。R 模式下仍整体取消。
- server:HandleCreatingWordEscape 以 CompositionRestored 帧回复
- windows:_HandleEscapeCancel 读取回复并应用,超时或不支持时回退到原取消
- ui-html:设置页「输入」增加开关
- 配置模板、两个设置宿主同步新增该键
|
2026-09-29 01:58:38 +08:00 |
|
Lu Fan(SonnyCalcr)
|
97049ffd7c
|
Merge pull request #517 from metasequoiaime/refactor/wubi-pinyin-mixed-input
feat(engine,server,ui-html,installer): 五笔拼音混输改为同时混排并拆出独立开关
|
2026-09-29 00:37:40 +08:00 |
|
fanlusky
|
378f4d43c0
|
fix(server): 整句候选的来源标签默认不显示
出厂模板、开发配置、代码默认值和设置页开关的初始状态一并改为关闭。
|
2026-09-28 21:52:25 +08:00 |
|
fanlusky
|
852444d82b
|
fix(server): 外部皮肤背景图铺满候选框边框下方,不再露出一圈底色
候选框 .container 是 overflow 滚动容器,::before 垫的背景图只能画到内边距盒,半透明边框下面露出的是底色,浅色主题下就是一圈白边。改为把背景图放进 .container 自己的背景层(origin/clip 都是 border-box),与 D2D 一样让边框画在图上;图层不能单独设透明度,就在图上盖一层 (1 - opacity) 的底色,底色取 D2D 同一份调色板。
|
2026-09-28 20:42:43 +08:00 |
|
fanlusky
|
0b4a3d374a
|
feat(server): 外部皮肤用 skin.toml 的 [toolbar] 表配置悬浮工具栏,替代 toolbar.css
toolbar_stylesheet 只注入 WebView2 页面,D2D 工具栏完全看不到,两个渲染器的工具栏配色因此不一致。
改为在 skin.toml 里用 [toolbar] corner_radius_dip 与 [toolbar.dark]/[toolbar.light] 的
background、border、handle、divider、icon、hover 声明覆盖:D2D 在基础皮肤之上叠加这些值,
WebView2 由 Server 生成当前主题的 CSS。颜色只放行颜色值会用到的字符,避免跳出 CSS 声明。
toolbar_stylesheet 随之移除,不做兼容:外部皮肤里的 toolbar.css 不再生效。
|
2026-09-28 20:07:30 +08:00 |
|
fanlusky
|
facafdcd7b
|
refactor(server): 移除外部皮肤 manifest 中已无用途的 preview 字段
preview 原本只用来充当候选框装饰图;装饰图改由 decoration.image 指定后,它不再被任何渲染或设置页使用。
|
2026-09-28 19:51:51 +08:00 |
|
fanlusky
|
24b2444a3d
|
feat(server): 外部皮肤支持候选框背景图、自定义圆角与装饰图对齐
- skin.toml 新增 candidate_window.corner_radius_dip、candidate_window.background(image / fit / opacity)和 decoration.image / decoration.align
- decoration 表改为可选;存在时 image、top_inset_dip、width_dip 必填且图片必须存在,不再回退到 preview
- D2D 候选框的装饰图与卡片同列排布,按 width_dip × top_inset_dip 等比缩放、贴在卡片上方且不重叠,卡片最小宽度遵守 min_width_dip 和装饰宽度,与 WebView2 渲染一致
- WebView2 端生成对应的背景、圆角和对齐 CSS;皮肤重载后 D2D 场景随之重建
|
2026-09-28 19:36:37 +08:00 |
|
Jia Sui
|
825fdebdfa
|
refactor(server): 去掉五笔混输无来源的配置迁移分支
|
2026-09-28 18:30:40 +08:00 |
|
Jia Sui
|
456fdb819c
|
feat(engine,server,ui-html,installer): 五笔拼音混输改为同时混排并拆出独立开关
Signed-off-by: Jia Sui <jsfaint@gmail.com>
|
2026-09-28 17:55:36 +08:00 |
|