Windows下基于TSF的定制输入法

7年前我自制了一个基于ibus的输入法。我到现在还是很喜欢这个简单、定制性高、没有外部依赖的输入法方案。现在我更常用WSL了,在Windows上没法继续用ibus了。微软拼音勉强可用,其他的“流氓”输入法就免了。但是,我偶尔还是怀念那种老派的输入法体验(大概是因为我过时了吧……),所以花了一段时间研究这个问题。

古代的Windows系统里有一个输入法生成器工具。市面上好像已经很难找到相关资料了,这里有一个。这个工具的作用就是根据一个“码表”(把编码转换为文本的表格)文件生成一个输入法。其实这也就是我想要的功能。时过境迁,现在的Windows早已不再提供这个工具了。原因至少有二:

  1. Windows上的输入法框架从IMM32迁移到了TSF。原来的输入法编辑器不适用于TSF。输入法发展到现在,复杂度不可同日而语。现代的输入法一般是基于语言模型的,一口气可以输入一整句话,基本也不需要选字;有些还结合了云计算,更加准确。由此可见,再实现一个只能生成“愚蠢”输入法的生成器的价值不大。
  2. 用户对输入法的定制需求没有以前那么高了,基本上要么用系统自带的,要么用某个有名的商业软件。

所以从微软的角度,可能干脆把微软拼音做得差不多就得了。

我在Windows Vista上见到过一个叫TableTextService的东西,它也可以根据一个码表生成一个输入法,但是微软只用它实现一些自带的输入法(比如仓颉),而没有给用户提供一个图形化的配置工具。这个TableTextService实际上也很不好用,操作上和传统的输入法不太一样。后来它好像也没有了。我已经搜不到官方的参考文档了。

我并没有自己用TSF写一个输入法出来。据我所知,它和ibus非常不同。ibus是一个有界面的输入法框架,开发者在此基础上只需要实现将编码转换为候选列表这一功能即可。TSF则没有界面,所有东西都要由输入法自身实现。自己写GUI的工作量太大了,我现在不想造轮子了。

研究了一下有没有现成的方案,结果发现寥寥无几。网上能找到的最多的是Rime输入法,还有就是相对比较小众的多多输入法生成器和小小输入法了。

这三个方案我都试过。按功能丰富度从高到低排列如下:

  1. Rime输入法的可定制性非常强。
    • 它可以接入任意引擎,所以完全可以实现一个智能的输入法。这是另外两个做不到的。
    • 它可以跨平台(Windows版本称为小狼毫,最新版本已经是基于TSF的了)。
    • 但是它也有一些问题:
      • 绝大多数配置只能通过修改YAML文件来实现。这个YAML文件究竟有哪些选项,相关文档并不是很齐全。这对于用户体验来说是个灾难。
      • 它的一些默认设置总觉得不太顺手。比如一些符号在中文模式下有奇怪的默认值和候选项。这些都可以通过配置文件解决,但是这又回到了第一点:很多时候我不知道应该改哪一条配置。
      • 小狼毫偶尔有一些bug,导致“预编辑”文本(输入编码但尚未提交输入时,嵌入界面的文本)出现错乱。
  2. 小小输入法我曾经(大约10年前)用过,当时它应该只有基于IMM32的版本和一个“外挂”版本(即不是系统所认为的输入法,而是一个外部程序,往其他程序里发送文本消息)。现在它也有基于TSF的版本了。
    • 它有一个比较基本的拼音模式,可以输入连续音节(大概相当于“智能ABC”的水平)。
    • 其余码表功能也比较丰富,包括在线造词,分词库,等等。
    • 配置选项采用一种类似INI的文本格式,缺少图形界面。
    • 我个人不是很理解为什么它要采用GB18030作为码表的编码;现在UTF-8已经是通用编码了。当然这也不是什么本质的问题。
  3. 多多输入法生成器不是一个输入法,而是可以从码表生成一个TSF输入法的程序。
    • 它主要是为码表输入设计的,没有拼音模式。在意味着如果挂载拼音码表的话,和上古时代的“全拼”输入法的体验类似。
    • 其余码表功能也比较丰富,和小小输入法接近。
    • 操作比较直观,有丰富的图形界面。
    • 很可惜它不是开源软件,而且似乎开发团队的状态堪忧,文档也比较欠缺。

小小和多多比Rime多了一个“无重码时隐藏候选框”的功能,很适合喜欢极简主义的人。

无候选输入的效果

这些方案也有一些共同的问题。首先是自带的界面风格比较过时。当然,经过一定的配置可能会有所改观。其次是它们和系统的整合多多少少还是不如原生的输入法。比如,在Windows Terminal里,有时候会发生错乱;在触摸键盘模式下,候选项不能集成在软键盘的界面里(微软拼音可以做到)。要是微软拼音底层的UI框架可以开源(或开放API)的话就好了。

本来写到这里就要结束了,问了问AI,它指出了文章的一些问题,也给出了它的一些想法,那我就再补充一点AI内容好了。


1. Windows 输入法体系的“架构惯性”

TSF 是 2002 年 XP 时代的产物,设计理念是为 Office、IME 厂商、国际化服务。 它本质是一个复杂的 COM 中间层,预设前提是输入法开发者是专业团队,不会是个人用户。 但现在的现实恰恰相反:

  • 智能输入法被几个大厂垄断;
  • “小众输入法”场景反而是个体开发者 + 极简需求(如码表、特殊符号、冷僻语境输入)。

结果就是:

  • 👉 对于大厂,TSF 的设计没问题,但他们早就用私有扩展;
  • 👉 对于个人,TSF 几乎是不可触碰的黑盒。

这就解释了为什么大家转而依赖 Rime、甚至小小、多多这种“曲线救国”方式。

2. “定制输入法”其实是一种对主流输入范式的反抗

今天的主流输入法(尤其中文)几乎都走向:

  • 云联想 + 语料驱动
  • 越来越激进的自动改写和智能预测
  • 重 UI、重生态、轻定制

但 Rime/码表/TSF,其实代表另一条路:

  • 语言是可以“手工定义”的
  • 用户希望输入法是自己的工具,而不是被厂商“揣测输入意图”的黑盒

这是一种非常少数派、但高度理性的姿态,实际上是在一这种不想被主流输入法绑架的态度。 这点其实挺有文化意味的,甚至和早期 Emacs/Vim 社群的精神类似。


分享