# wanginput **Repository Path**: ooooinfo/wanginput ## Basic Information - **Project Name**: wanginput - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # InputWay 跨平台拼音 + 五笔输入法 — 一套 Rust 引擎 + 三个平台壳(Windows TSF / macOS InputMethodKit / Linux Fcitx5)。 ``` inputway/ ├── engine/ Rust 共享内核(核心 + C ABI 导出) │ ├── src/lib.rs │ ├── src/session.rs 组合状态、按键、候选、用户词典、模式切换 │ ├── src/segment.rs 拼音音节切分 + 模糊音 │ ├── src/sentence.rs beam 整句转换 │ ├── src/dict.rs 词库(嵌入二进制 blob,含拼音区+五笔区 + 运行时用户词) │ ├── src/convert.rs OpenCC 单字级简繁映射 │ ├── src/ffi.rs C ABI(含 im_mode / wubi_auto_commit / trad) │ ├── build.rs 编译时把 rime-ice 词库 + 五笔码表 + 简繁表一起嵌入 │ ├── assets/dict/ pinyin(base/8105) + wubi86_jidian{,_extra} + s2t/t2s │ ├── scripts/ 离线工具(build_s2t.py 从 OpenCC 生成 s2t.txt) │ └── include/inputway.h 三个平台壳共享的 C 头文件 ├── platforms/ │ ├── windows/ TSF COM 服务(C++/MinGW,700KB DLL) │ ├── macos/ InputMethodKit(Swift) │ └── linux/ Fcitx5 addon(C++,CMake) └── README.md ``` ## 一、引擎能力 * **拼音全拼**(408 个音节,rime-ice base + 8105 单字词典,54 万词条,编译时嵌入) * **整句转换**(beam 搜索,宽度 6) * **候选排序**(按 unigram 概率 + 长度偏好;常见输入 1-2 汉字即匹配) * **可选模糊音**(zh↔z, ch↔c, sh↔s, an↔ang, en↔eng, in↔ing, n↔l, f↔h) * **五笔86**(89k 字符码表,4 码全字 / 1-4 简码自动顶屏,5 码以上也支持,词组码表来自 rime-wubi86-jidian-extra,约 625 条 2-3 字词) * **五笔末笔/字型容错**(4 码输入无精确命中时追加 `[末笔容错]` `[字型]` 候选) * **五笔词组整码**(rime-wubi86-jidian-extra:2-3 字词直接整码,如 `thlk → 自驾`) * **可选简繁转换**(`trad` 选项启用 OpenCC STCharacters 表 1:1 单字映射;不含词级繁简) * **用户学习**(选词后加权,存到 `%APPDATA%/InputWay/user.dict` 等) * **多页候选**(每页 9 个,空格/= 翻页,1-9 快速选择,Esc 清空,Enter 提交原文) * **模式切换**:拼音 ⇄ 五笔(运行时切换:C `ime_engine_set_option(engine,"im_mode",1)`) ```bash # 拼音演示 echo 'nihao|women|shiyong|shuru|fa' | cargo run -q --bin ime-demo # → 你好我们使用输入法 echo 'zongguorensuode|jiefang|jun' | cargo run -q --bin ime-demo -- --fuzzy # → 中国人民所得解放军 # 五笔演示 echo 'wq|trnt|k|aaa|ttfhh|thlk' | cargo run -q --bin ime-demo -- --wubi # → 你我中工 → TF卡 → 自驾 # 说明:demo 默认空格 = 取第一候选;首位按频度。 ``` ## 二、构建引擎(任何平台) ```bash cargo build --release -p inputway-engine # 产物: # target/release/inputway_engine.dll (Windows) # target/release/libinputway_engine.so (Linux) # target/release/libinputway_engine.dylib (macOS) # target/release/ime-demo.exe 命令行 REPL 演示 ``` 18 个单元测试覆盖词典查找、片段、整句转换、页面选择、部分提交/清空、学习、模糊、FFI ABI、性能、五笔基础查询、五笔空格提交、五笔唯一4 码自动上屏、五笔词组、五笔容错、简繁: ```bash cargo test -p inputway-engine # 18/18 passed ``` ## 三、平台壳 ### Windows(已编译 + 注册脚本) ```cmd :: MinGW g++ on PATH, then: scripts\register.bat :: 显示 "Registered. Open Settings ...";脚本会自行 build inputway_tsf.dll。 :: 然后设置 -> 时间和语言 -> 中文(中国) -> 选项 -> 添加键盘 -> "InputWay 拼音输入法"。 :: 注销登录或运行 taskkill /f /im ctfmon.exe & start ctfmon.exe 可立即生效。 scripts\unregister.bat ``` DLL 文件大小:700KB(不含字典;字典在 inputway_engine.dll,~29MB)。两 DLL 必须放在同一目录,因为 inputway_tsf.dll 通过目录查找动态加载 inputway_engine.dll。 候选窗:自绘悬浮无焦点 popup(GDI/Microsoft YaHei UI)。点击候选 → 回调走 `select()`。翻页键 `=`/`-`、上下键、Esc、Backspace、Enter 全部支持。 **模式切换**:输入过程中按 **Ctrl+Shift+M** 在拼音 ⇄ 五笔 之间循环;切换会清空当前输入(模式间隔离)。五笔模式下顶屏规则:4 码唯一命中 → 自动上屏;非唯一 → 候选窗按 1-9 / 空格选。 ### macOS(Swift 骨架 + IMK) 需要 macOS / Xcode。仓库包含 `InputWayIMKController.swift` 骨架(IMKInputController 子类),把 IMK 的 `handle(_:)` 翻译成 engine C ABI 调用,剩余 stub(Info.plist、Xcode 工程)见 `platforms/macos/README.md`。 ### Linux(Fcitx5 addon) ```bash mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release && make -j sudo make install # 把 engine .so 也复制到 /usr/lib/fcitx5/ 下 sudo install -m 644 ../../target/release/libinputway_engine.so /usr/lib/fcitx5/ # 在 fcitx5 配置工具里添加"拼音"方案 ``` Fcitx5 framework API 在 `fcitx5/Fcitx5Utils.h` 中,平台壳代码代码遵循官方 addon 添加模式(FcitxInputMethodEngine 子类 + AddonFactory)。 ## 四、C ABI(共享头文件 `engine/include/inputway.h`) ``` ImeEngine* ime_engine_new(const char* user_dict_path); // NULL = 不学习 void ime_engine_free(ImeEngine*); /* name: "fuzzy" -> 0|1 * "im_mode" -> 0=pinyin / 1=wubi * "trad" -> 0|1 (simplified<->traditional on commit) * returns 0 ok, -1 unknown */ int ime_engine_set_option(ImeEngine*, const char* name, int value); void ime_engine_flush(ImeEngine*); const char* ime_engine_version(void); ImeSession* ime_session_new(ImeEngine*); void ime_session_free(ImeSession*); void ime_session_reset(ImeSession*); int ime_session_process_key(ImeSession*, uint32_t key); // IW_KEY_* / printable int ime_session_commit(ImeSession*, char* buf, int buf_len); // bytes copied const char* ime_session_composition(ImeSession*); int ime_session_candidate_count(ImeSession*); const char* ime_session_candidate_text(ImeSession*, int i); const char* ime_session_candidate_comment(ImeSession*, int i); int ime_session_page(ImeSession*); int ime_session_page_count(ImeSession*); int ime_session_next_page(ImeSession*); int ime_session_prev_page(ImeSession*); int ime_session_select(ImeSession*, int i); // 当前页内 0-based int ime_session_wubi_auto_commit(ImeSession*); // 1 if unique 4-letter wubi prefix ``` Special key codes: `IW_KEY_BACKSPACE = 0xE80001`, `IW_KEY_ENTER = 0xE80002`, … ## 五、已实现 / 待完善 | 功能 | 状态 | |---|---| | 拼音全拼 + 候选 + 整句 | ✓ 单元测试全过 | | 模糊音(常用六对) | ✓(`--fuzzy` / `ime_engine_set_option(engine,"fuzzy",1)`) | | 用户学习 + 用户词典持久化 | ✓ | | 多页候选 + 数字键选择 | ✓ | | 五笔86(89k 字 + 2-3 字词码) | ✓ `--wubi` / `ime_engine_set_option(engine,"im_mode",1)` | | 五笔唯一4 码自动上屏 | ✓ `ime_session_wubi_auto_commit` | | 五笔末笔/字型容错 | ✓ 4 码输入无精确命中时追加 `[末笔容错]` `[字型]` 候选 | | 5 码以上长码字 | ✓ 自动识别(例 `ttfhh` → TF卡) | | 简繁转换(单字级 OpenCC STCharacters 表) | ✓ `ime_engine_set_option(engine,"trad",1)` | | Windows TSF(注册表 + 候选窗) | ✓ 编译通过 | | macOS IMK 骨架 | 骨架(需在 Mac 上补完 Xcode 工程 / Info.pl) | | Linux Fcitx5 addon | 骨架(需在 Linux 机器上 CMake + install) | | 双拼(自然码/小鹤 等) | ⏳ 引擎预留 scheme 接口,未实现 | | 五笔98 / 新世纪 | ✗(五笔86 之外的变体) | | 二元 / 三元语法模型 | ✗(unigram;可对大词库做统计逼近) | | 简繁词级(如("国"↔"國") | ✗(需 OpenCC TSPhrases + 最长匹配算法) | | 云端 / 同步 | ✗ | ## 六、贡献 欢迎补完 macOS 和 Linux 壳、补双拼方案、扩展语法模型。 ## 七、万能五笔码表导入(个人使用) 如果你本机装有万能五笔,可以把它主码表(wb86.dat,约 18.7 万词条,含大量 现代词:劳斯莱斯 / 菊花台 / 自驾 等)提取出来,运行时导入 InputWay,三端通用。 ```bash # 1) 从本机万能五笔安装目录提取(仅个人使用,勿分发): python engine/scripts/extract_wnwb.py "%APPDATA%\WanNengWBInput.4.4.26093\Dict" engine/assets/dict/local/wnwb_wubi.dict python engine/scripts/refine2_wnwb.py # 边界精修 # 2) 部署到用户数据目录(Windows 壳自动加载该路径): cp engine/assets/dict/wnwb_wubi.dict "%APPDATA%/InputWay/wnwb_wubi.dict" # 3) macOS / Linux:放到引擎同目录或调用 # ime_engine_import_dict(engine, "/wnwb_wubi.dict") ``` 原理:wb86.dat 是按五笔码字典序排列的 UTF-16 词条流(`__GS__` 容器), 用开源 rime 86 码表做锚点对齐 + EM 修正恢复每个词条的编码;idx 哈希桶未解, 靠单调性约束保证不出错字(错则漏词、绝不打错字)。对拍率 ~70%(万能的 合法多码/异序会压低该口径),实验性功能。 该表通过 `ime_engine_import_dict` 在运行时合并(导入词频度映射到可与内嵌 词表竞争的区间),该表由 `engine/scripts/extract_wnwb.py` 从本机安装的万能五笔提取生成。