输入法的奇妙冒险: rime 之血

01 Oct 2024 2390 words 8 minutes BY-SA 4.0
develop ime

输入法的名字叫 rime , 15 岁。住在 github 的 rime 组织的 librime 仓库……

串台了。

rime

据我观察,输入法用户分为以下 2 类:

  1. 系统预装了什么输入法就用什么
  2. 要输入方言 / 要自己定制 / 要保护隐私……然后有自己摸索出的一套解决方案

rime 是为后者准备的。

当然,欲戴王冠,必承其重。古尔丹,代价是什么呢?

代价是当别人已经开始轻松打字的时候你还在那里研究 rime 的 yaml 语法……

试举几例:

希望每页显示 10 个候选栏:

---
patch:
  menu/page_size: 10

希望 Control + 4 切换简体 / 繁体:

---
patch:
  key_binder/bindings/@before 0:
    accept: Control+4
    toggle: simplification
    when: always

一个可能的好的帮助方案是基于 json schema 的语言服务器的自动补全功能:

json schema

但相关 issue 似乎毫无动静……

librime

严格地说, rime 不是一个输入法,而是一个封装了输入法逻辑的库。任何用户可以基于此库开发特定于某一平台(称为前端)的输入法。

采访这一设定是作者佛振本人在百度开发输入法时学到的。 但必须承认这一设定以及 rime 的开源让 rime 成为了当今支持最多平台的输入法,甚至有些前端你根本想象不到:

python

zsh

neovim

真正意义上的跨平台

除了上面 3 个笔者自己开发的 rime 前端外,笔者经常使用的 rime 前端还有:

大多数 rime 前端都会有切换输入方案、部署、同步三个按钮。

ibus-rime

切换输入方案

输入方案指全拼、五笔、双拼等。笔者常用的输入方案是微软双拼和日本语。

没错, rime-japanese 让罗马字也成为了一种汉字的输入方案。

当然,如果你学会了 rime 的 YAML 语法,其他非汉字的输入法也是可以的,比如维吾尔语:

uyghur

双拼和全拼相比方案不唯一,以笔者选择的微软双拼为例:

trime

输入“你好”需要按下 nihk 。这里的 k 就是 ao 。这样所有汉字都只需要 2 次按键,一次声母一次韵母。 顺便一提,因为有一定的学习成本,所以双拼的用户比全拼少不少,进而一些商业输入法对双拼的测试就不太够,有些地方 bug 很多。 一个离谱的案例是 Android 的百度输入法,正常输入“拽”需要按下 vy 然后解码得到 zhuai ,输入“越”需要按下 yv 然后解码得到 yue 。但实际上在他们的输入法下按下 yv 解码得到的是 yzh ,这根本构不成任何全拼。笔者建议有使用双拼、粤拼、注音、吴语等小众的汉字输入方案的用户可以使用 rime 来看看能不能得到更好的用户体验。

部署

rime 输入方案的配置文件是 YAML 。为了加快速度,会被编译为若干二进制文件。

用户可以在命令行中通过 rime_deployer --build 来编译。

--build [user_data_dir] [shared_data_dir] [staging_dir]
        Build and deploy Rime data.
        If unspecified, user_data_dir and shared_data_dir defaults to the working directory.
        To deploy data for ibus-rime, use the following directories:
        user_data_dir    ~/.config/ibus/rime
        shared_data_dir  /usr/share/rime-data
        staging_dir      ~/.config/ibus/rime/build

最后一个参数的输出目录。前两个参数是输入目录,分别是用户自定义的配置和系统安装的配置。系统安装的配置的一些设置选项被用户自定义的配置覆盖后得到最终的 YAML 文件会在输出目录中,可以查看以确认用户配置是否正确。编译得到的二进制文件也在输出目录中。

同步

通过网盘同步词库。 rime 自带的词库很小。举个例子,用户 1, 2, 3 的词库是集合 A, B, C ,商业软件可能会携带一个很大的词库是这些集合的并集,而 rime 则会倾向于携带一个较小的词库包含这些集合的交集。 所以用户需要“养”自己的词库。这个很像 Ubuntu 和 ArchLinux 的区别:一个系统上预装了很多软件,用户需要卸载自己不需要的以节省空间;另一个系统上则预装了很少但不可或缺的软件,用户需要安装软件以满足自己的需要。

rime 也有一些方案来将一些词库添加到输入法中。比如 rime-emoji 添加绘文字。 笔者也以之为参考写了一个 rime-kaomoji 来输入颜文字。 原理其实是借助了 openCC ,一个基于 Markov 模型的简繁中文转换的库,将一些词库作为某些繁体中文的“简体”加入了词库。例如同文输入法那张图中的“你好”。

rime 插件

rime 也提供了一些插件来支持高级功能,比如 rime-lua 允许输出候选项是通过某个 lua 函数计算得到的。自此,你可以输入 shijian 得到当前的时间。一些高级功能,比如拆字来输入不知道拼音的汉字、五笔反查拼音,都被 rime 支持。

作为系列文章的第一篇,仅仅介绍 rime 的使用方法的冰山一角。但也足以管中窥豹见到 rime 的伟大。

“对一个匠人来说,创作一件有情调的作品,一定是出于对精湛技艺的追求。如果仅仅是为了现实目的,固然可以写出高质量的软件,代码本身却容易缺乏灵气。”

– 佛振

https://user-images.githubusercontent.com/32936898/199681341-1c5cfa61-4411-4b67-b268-7cd87c5867bb.png https://user-images.githubusercontent.com/32936898/199681363-1094a0be-85ca-49cf-a410-19b3d7965120.png https://user-images.githubusercontent.com/32936898/199681368-c34c2be7-e0d8-43ea-8c2c-d3e865da6aeb.png