输入法
输入法在非英语环境下都是绕不开的问题。
基本实现
以 Debian 为例,keyboard-configuration包维护了/etc/default/keyboard
配置来设置键盘类型(例如国内的都是 qwerty 美标键盘)。
console-setup提供了一个简单的与控制台类似的输入法来用于 X Window System 中,键盘输入使用 XKB(X keyboard Extension)进行处理,生成的键盘数据通过 XIM(X Input method)协议和应用程序进行通信。
如果更改了 keyboard 可以通过
systemctl restart keyboard-setup
服务来真正生效
这个基本实现非常对按键的处理非常简单就是将对应的键位映射到对应的字符即可,因此这种简单的机制无法支持某些语言,这其中的重灾区就是 CJK。
Linux 内核提供了一个更为原始的键盘输入支持,但是只能用于控制台
IM 框架
由于基本实现无法支持 CJK 这样的语言,因此现代的 GUI 系统都提供了 IM(Input Method)框架,这其中比较流行的是 ibus 和 fcitx。IM 框架后面还要 IM 引擎来处理输入(简单讲就是某个或者某些按键对应 CJK 的哪个字符)。
对于 GTK 和 QT 应用程序,生成的数据通过 D-Bus 通信来传递给他们。而对于其他 X 应用程序,生成的数据通过 XIM 协议来传输(此时就又回归到基本实现了)。
Keyboard Application
| ^
| |
+-> Linux kernel -> Input method (IM) -> Gtk, Qt, X, Wayland
+-- Engine--+
debian 中还提供了im-config工具来显示和设置 IM 框架:
# 列出目前存在的 IM 框架
yangguodong@debian:~$ im-config -l
ibus xim
# 如果想要禁用 IM 框架,此时只能 xim 或者由桌面提供
# im-config -n none
整个键盘输入流程
我们以 Debian12 为例说明整个 Linux 的键盘输入处理过程:
- 对于 Linux 控制台,键盘输入由 Linux 内核处理(keymaps)
- 对于没有 IM 的 X 环境,键盘输入由 XIM 处理
- Wayland 环境依然可以使用 Xwayland 来支持 X 应用程序,而非 X 应用程序则需要 IM 框架
- 现代操作系统建议必须配置 IM 框架,例如 ibus 和 fcitx,只要存在 IM 框架则键盘操作交由 IM 处理
- GTK 应用程序通过 D-Bus 与 IM 通信,而具体 IM 由
GTK_IM_MODULE=<input-method>
环境变量指定,注意需要安装 ibus-gtk ibus-gtk4、ibus-gtk3 等输入模块 - QT 应用程序通过 D-Bus 与 IM 通信,而具体 IM 由
QT_IM_MODULE=<input-method>
环境变量指定,需要安装 libqt5gui5 输入模块 - 而 X 应用程序(缺省)这使用 XIM 协议来通信,由
XMODIFIER=@im=<input-method>
环境变量指定
大多数发行版都建议在
/etc/environment
文件中创建上面三个环境变量到 ibus 或者 fcitx,而 debian 中由 im-config 自动提供了
ibus
GNOME 桌面环境和 ibus 深度绑定,并且ibus也是 GNOME 的依赖。
如果想要 ibus 正确的处理中文,还需要安装对应的引擎,目前推荐的有三个:
- ibus-rime: 著名的 rime 引擎,支持繁体/简体中文
- ibus-libpinyin: 曾经的王者,即智能拼音引擎
- ibus-table: 基于 table 的输入法引擎,提供了五笔、仓颉等输入方式
之后还需要安装 QT GTK 相关的依赖:
GNOME 下启用 ibus
在 GNOME 中 ibus 是自动安装并激活的,而引擎需要开启.通过Settings -> Keyboard
:
如果安装了对应输入法引擎而没有发现,查看是否没有安装 locale-gen 中的 zh_CN.xx 支持。
有些教程中介绍独立安装需要 ibus-setup,至少在 GNOME 中这不起作用。
fcitx5
rime
rime 作为最推荐的中文输入法引擎,这里将详细介绍下他的配置。注意他没有 GUI 配置工具,所有配置都是基于 yaml 格式的配置文件。
配置文件组织
rime 的配置目录位于:
# ibus 中
~/.config/ibus/rime/
# fcitx 中
~/.config/fcitx/rime/
# fcitx5 中
~/.local/share/fcitx5/rime/
其中由程序自动生成的文件包括:
<输入法schema>.userdb/
: 里面是 Sqlite3 数据库,是用户在对应输入法方案下的输入习惯installation.yaml
: 安装信息user.yaml
: 用户状态信息build/*
: 部署过程中生成的配置等文件trash/*
: 失效的文件,通常是由于 Rime 升级而不在使用的文件,用户如果确认不需要可以直接删除
而用户可以配置的文件类型包括:
<输入法schema>.schema.yaml
: 用户自定义的输入方案<输入法schema>.dict.yaml
: 特定输入法方案挂载的字典<词典名称>.txt
: 真正的字典文本,以词汇<Tab>编码<Tab>词频
的形式组织default.custom.yaml
: 默认用户配置,应用于所有输入法 schema, 并且设置默认你的输入法 schema 也是在这里实现的<输入法schema>.custom.yaml
: 特定于输入法模式的用户配置
安装第三方配置
由于 rime 默认是繁体输入法,内置的是繁体字库。而它的简体也仅仅是将繁体转换为简体实现的。因此并不好用。还在 github 上有很多大神维护了更好的字库,例如rime-ice就是一个很好的集成配置。
我们只需要将它 clone 到 rime 的配置文件目录中,然后 重新部署 rime 即可:
常见问题解决
在使用过程中会有一些问题。
ibus-rime 中输入框竖排
只需要编辑~/.config/ibus/rime/build/ibus_rime.yaml
: