跳转到内容

小企鹅的二十年

2000 年前后的 Linux 桌面,与今天不是同一个世界。

KDE 和 GNOME 正在激烈竞争,GTK 与 Qt 生态尚未成熟,发行版数量众多且碎片化。对中文用户而言,最大的麻烦甚至不是显卡驱动,而是一件更基础的事:系统装好了,却打不了中文。

当时能用的中文输入方案有 XCIN、Chinput、MiniChinput 等,但普遍配置复杂,不同桌面环境之间兼容性差,GTK 与 Qt 支持不一致,维护者有限。很多用户第一次安装 Linux 后,需要花几个小时研究文档,才能让输入法勉强工作。

在那个中文 Linux 用户本来就不多的年代,愿意长期维护中文输入法的人更是凤毛麟角。


2002 年,一个网名叫 Yuking(鱼王)的开发者是五笔输入法用户。他发现现有方案不能满足自己的需求,于是做了一个后来无数程序员都做过的决定:既然没有合适的工具,那就自己写一个。

这个项目最初叫做 gWubi——顾名思义,一个给 Linux 用的五笔输入法。但 gWubi 1.0 发布时,已经同时支持五笔、拼音和区位码输入,从一开始就超出了”五笔专用工具”的范畴。

随着功能不断扩展,项目开始向输入法框架演化,需要一个新名字。Yuking 的想法是取 FCIT,来自”Free Chinese Input Tool”。但在提交代码时,他多敲了一个字母 x,变成了 Fcitx

2004 年,项目正式更名 Fcitx。Linux 的吉祥物是企鹅 Tux,Fcitx 也采用了企鹅形象作为图标,中文名随之定为小企鹅输入法。后来很多人只知道”小企鹅”,未必知道”Fcitx”这个英文名。


2007 年,转折出现了。

云帆论坛上有人公开批评 Fcitx 的代码写得很差。Yuking 受不了这个评价,在当年 7 月 10 日宣布终止项目

项目就这样停了。没有交接,没有继承者,代码扔在那里。当时的社区里弥漫着一种真实的失落感——小企鹅可能真的要没了。

沉寂了一年多之后,2008 年 9 月,Yuking 自己回来了。他在帖子里写道,无法忘记 Fcitx。他加入了爱好者在 Google Code 上建立的新仓库,开始频繁更新,项目重新活了过来。

但更深层的危机还埋在那里:一个人撑着的项目,终究脆弱。


2009 年秋,一个大四学生在论坛上发现了 Fcitx,因为想让它更好地支持 KDE 的 Kimpanel 面板协议,便开始给这个项目提交代码。

他叫翁学添,网名 CSSlayer

他后来在博客里记录了那段缘起,原话是:“总而言之,我就莫名地接手了这个项目的 fcitx 的部分,然后谁也不知道这埋下了一颗怎样的种子……”

从 Fcitx 3.6 版本开始,翁学添逐渐成为主要维护者。他做的不只是修 bug:整理历史代码、拆分模块、把编码从 GBK 迁移到 UTF-8、引入插件架构、重构通信机制。Fcitx 4 时代,它成了 Linux 桌面上最主流的中文输入法框架,被 Arch Linux、openSUSE、Fedora 等主流发行版收录。

许多开源项目在创始人离开后迅速衰落。Fcitx 成为了少数成功完成维护权传承的案例。


2010 年后,另一个名字开始频繁出现在中文 Linux 社区:Rime(中州韵)

Rime 本身是一个输入法引擎,而不是框架。它的特点是:高度可定制,配置文件全文本化,支持复杂的输入方案,几乎可以模拟任何一种汉字输入法的行为。对高级用户而言,它提供了接近”理想输入法”的可能。

当 Rime 以插件形式接入 Fcitx 之后,Fcitx + Rime 成了大量技术用户的首选组合,直到今天依然如此。


如果说与 IBus 的竞争带来的是压力,那么 Wayland 带来的是生存挑战。

输入法与图形系统深度绑定。Wayland 与 X11 的设计理念完全不同,许多在 X11 时代理所当然的实现方式,在 Wayland 下全部失效:GTK 需要重新适配,Qt 需要重新适配,候选框定位机制需要重写,KDE 与 GNOME 的行为也不一致。

许多项目选择观望或打补丁。翁学添的选择是:重构,而不是修补。


2017 年,翁学添在博客上开始连载《The Road to Fcitx 5》系列文章。

这不是一次普通的版本升级,而是接近完全重写的工程。他甚至为此专门从头实现了一个底层库 xcb-imdkit——一个用纯 C 写的 XCB 输入法协议库,因为当时根本没有现成的 XCB 实现可以用。Qt 和 SDL2 长期缺少 XIM 支持,根源正在于此。

同年,他还写了 libime,一个全新的拼音和码表引擎,从零实现了分词算法和词频模型,替换掉 Fcitx 4 时代早已过时的旧引擎。整个开发过程被详细记录在博客里,是难得的一手技术文档。

2020 年,fcitx5 正式发布。原生支持 Wayland,模块化插件架构,支持语言扩展到日文、韩文、越南文、藏文等,候选框渲染、主题系统全部重写。Fcitx 4 进入只读维护模式。


桌面端的问题解决了,但手机上一直是另一个缺口。

Android 上早有同文输入法(Trime)——同样基于 RIME 引擎,2015 年起步,但体验长期偏粗糙:候选词界面难用,容易崩溃卡顿,对于习惯了桌面 Fcitx 的用户来说落差明显。

2021 年,berberman 出现了。

他是个 Haskell 程序员,NixOS 重度用户,GitHub 主页的 location 填的是”Gensokyo”——东方 Project 里的幻想乡。他还是 haskell-language-server 的贡献者,以及 Arch Linux 上 Haskell 生态维护者之一。这样背景的人,去做了一件听起来风马牛不相及的事:把 fcitx5 移植到 Android。

技术上这并不简单。fcitx5 核心是 C++ 写的,要在 Android 上运行,需要通过 JNI 将 C++ 库接入 Android 的 Java/Kotlin 层,同时还要处理 Android InputMethodService 与 fcitx5 输入上下文之间的完整对接。berberman 与另一位开发者 rocka 等人合作,从头搭建了整套工程。

Fcitx5 for Android,中文名重新叫回”小企鹅输入法”,2022 年逐渐成熟,支持内置拼音方案开箱即用,也支持 RIME 插件。可从 F-Droid 或 Google Play 安装。


从 2002 年 Yuking 手滑打出那个 x,到翁学添接手重构,再到 berberman 把它带进每个人的口袋——Fcitx 经历了被宣布终止、又死而复生,经历了从 X11 到 Wayland 的架构革命,经历了从桌面到移动端的跨越。

KDE 2 已经变成了 Plasma 6,GNOME 2 已经变成了 GNOME 46,X11 正在被 Wayland 取代。许多当年的软件早已消失,许多项目停止了更新。

而小企鹅还在。

这中间没有公司,没有融资,没有路线图。只有一个个觉得”这件事值得做”的人,在某个时间点接过了接力棒。