把 fcitx5-android 改造为 Colemak + 紫光双拼 触屏输入法

small parking
目录

今天把开源的 fcitx5-android 键盘从上到下改造了一遍:Colemak 键位 + 紫光双拼自动提示 + 双拼展开上屏,让触屏键盘既保留了 Colemak 肌肉记忆,又能直接"看见"双拼的声母/韵母分区。

改造后的键盘截图如下。

改造后的 Colemak + 紫光双拼 触屏键盘

所有改动都在 GitHub 上可复现:

  • 主仓库 fork:https://github.com/xtccc/fcitx5-android-colemak
  • 子模块 fork:https://github.com/xtccc/fcitx5-chinese-addons

下面把每一项功能变动梳理一遍。

1. Colemak 触屏字母布局

把内置字母键盘从 QWERTY 改成 Colemak 排列,同时保留 Caps 与 Backspace 功能键:

QWERTY:   Q W E R T Y U I O P
Colemak:  Q W F P G J L U Y ;
          A R S T D H N E I O
          Z X C V B K M

注意第三行末位多了一个 ;(N 之后)——这是为紫光双拼补的键位,见下一节。

2. 紫光双拼:声母/韵母提示贴片

这是这个输入法最"肉眼可见"的改动。每个字母键上方显示声母(韵母原始控制区),下方显示韵母,用紫光双拼方案的映射表标注。这样手指在 Colemak 布局上,一眼就能找到对应该韵母的键。

完整的 26 键对应关系(紫光/双拼方案):

声母(上) 韵母(下)
Q q ao
W w en
F f ian
P p ai
G g iang/uang
J j iu/er
L l uan
U zh
Y y in/uai
; ing
A ch
R r an
S s ang
T t eng
D d ie
H h ong/iong
N n ui/ue
E e
I sh
O o uo
Z z ou
X x ia/ua
C c
V v v/ü
B b iao
K k ei
M m un

可以看到:声母键集中在左手列(U=zh、A=ch、I=sh 竖向排开),韵母分布在各字母键下方,一眼即得。顶行末位补回 ; 键——紫光方案把 ing 放在分号键上。

3. 英文状态自动隐藏双拼提示

双拼提示只在中文输入法激活时显示。当切到英文 IME,字母键上的声母/韵母小标签自动隐藏、字母回中,界面干净。

实现上,在 onInputMethodUpdate 里按输入法语言码判断:languageCode.startsWith("zh") 则显示提示,否则隐藏。

4. 双拼全拼展开上屏

改动了 fcitx5-chinese-addons 子模块,把 PinyinInPreedit 的默认值从 false 改成 true

效果:双拼输入 h s 时(打字的时候显示的是 h s),上屏的 preedit 变成完整的声母+韵母(如 h ang),而不是原始按键。这让看着 preedit 就能知道实际拼的是什么拼音。

5. 子模块改写与分发

项目本身是多个 git 子模块组成的(fcitx5、libime、fcitx5-chinese-addons 等 20+ 个)。这次只改了 fcitx5-chinese-addons 这一个子模块(pinyin.h 的一行默认值)。为了让别人 clone 主仓库后能完整构建,做了两件事:

  1. 把改动的子模块 commit 推到个人 fork xtccc/fcitx5-chinese-addons
  2. 主编里通过 .gitmodules 把这个子模块的 URL 指到个人 fork,其他 19 个子模块仍用官源 URL 自动拉取。

这样 git clone --recursive 你的 colemak 版本即可复现整套输入法。

构建

环境是 Arch + Nix flake(devShell .#noAS),构建抓到 arm64 调试版:

nix --extra-experimental-features "nix-command flakes" develop .#noAS -c \
  './gradlew :app:assembleDebug -PbuildABI=arm64-v8a --console=plain'

产物在 app/build/outputs/apk/debug/

小结

这四个改动加起来,得到的是一套Colemak 键位 + 紫光双拼可视化 + 英文自动隐藏 + 全拼展开上屏的 Android 全功能完整输入法。代码、fork、构建命令都在上面,欢迎自取。