这年头混迹赛博宇宙,零信任原则的重要性不言而喻。以个人输入法为例,鉴于一些厂商不太体面的行为预设123,选择使用离线、开源的输入法已经成为一项紧迫的需求。

4202年的现在,依然出现了4这样的报告,我怎么一点也不意外呢。

选型

但凡做过些调研的朋友们应该都会投入rime的怀抱。rime在不同平台上有着不同的发行版,各有各的发行版配置,但主体部分还是互通的。 在其官网就可以找到下载链接,涵盖了Windows, macOS, Linux, Android,甚至还有(不确定有没有坑的第三方?的)iOS客户端

配置

出于对折腾的热情,我目前的主要使用平台是Arch Linux和Android,不过由于各发行版之间只有少量配置区分,这里我会按照如下三部分进行记录:

共通

全拼

Rime 定製指南固然十分详尽,对于新人上手却不十分友好,我选择了薄荷输入法作为自己的初始化模板。这个初始化模板已经足够好用,且使用了雾凇拼音的非常好用的词库,以至于在我只使用ibus-rime的那一段时间都并未对其本身做太多修改(尽管至今也依然如此),仅关闭了它自带的模糊拼音、五笔与比划依赖。我的版本已公开在github,同时附上我参考的原始版本

双拼

本着一步到位的原则,既然折腾了,干脆就顺便把听闻已久的双拼给安排了。听了朋友的推荐,我选用的是小鹤双拼的方案,顺便把薄荷拼音的一些特性整合了进来,大体修改同上,同样已公开在github,并附原始版本

Arch Linux: ibus-rime

Linux上的输入法一般由ibus或是fcitx管理,参考官方文档仅需修改少量配置即可:

# default.custom.yaml
patch:
  "ascii_composer/good_old_caps_lock": true
  "ascii_composer/switch_key":
    Caps_Lock: commit_code
    Control_L: noop
    Control_R: noop
    Shift_L: commit_code
    Shift_R: inline_ascii
  "menu/page_size": 9
  schema_list:
    - {schema: flypy}
    - {schema: rime_mint}
  "switcher/hotkeys":
    - "Control+grave"
  "switcher/save_options":
    - full_shape
    - ascii_punct
    - simplification
    - zh_hans
    - emoji_suggestion
  "translator/enable_encoder": true
  "translator/enable_sentence": true
  "translator/enable_user_dict": true
  "translator/encode_commit_history": true

Android: trime

安卓平台的rime发行版为trime,看起来似乎是第三方基于librime开发的。当前该发行版似乎还在积极改进中,我在这就暂不吐槽我在修改配置过程中遇到的种种bug了,仅贴上官方文档并提醒:时刻记得备份自己的配置文件(们),以及尽可能不要使用其GUI中的键盘设置不然会变得不幸

我是基于同文官方的trime.yaml修改的配置,主要调整了少量键盘布局、增加了夜间配色、实现了少量自定义按键以及移除了大量(对我而言)没什么用的键盘、配色等,我的方案可以参看我的gist

关于夜间配色

官方文档中指出如下:

[3.2.6]dark_scheme:配色方案如有此参数,即视为明亮模式的配色。当系统切换为暗黑模式后,再次弹出键盘时,自动切换配色方案为dark_scheme指定的配色。

不过经过我的实测,这样配置确实可以自动切换到夜间模式,但是在自动切换回日间模式时,输入法的悬浮窗还会保留夜间模式的配色,这点在trime官方群讨论中得到了证实,希望日后可以得到修复(

关于按键自定义

自定义按键理论上可以做很多有意思,不过另一方面,输入法做得过于喧宾夺主也并不值得推崇。 这里只举一个例子,权当抛砖引玉:

Bili: {label: B站, command: run, option: "bilibili://search/%4$s"}
# ...
      - {click: 'r', long_click: 'Bili', swipe_up: 4}

这里我把长按r键设置为了使用bilibli app搜索当前文本框光标前的字符。其中,bilibili://search/的字段可以通过adb shelllogcat | grep结合app内手动操作获取到,理论上其他app也可以通过类似的方法获取,具体还请自行实践。

DLC

同步方案

说点题外话,rime的发行版们其实有实现基于uuid的同步方案,不过这种方式其实就是生成了一个sync文件夹,具体的云端同步还需要另外结合网盘使用。加之我在配置trime时留下的不好的回忆,让我对这个方案不甚放心。 最后我还是部分使用了librime的这套方案,在git同步配置文件的基础上使用了syncthing来同步用户词库:

  • git部分
    • 使用master分支同步共通配置,并主动剔除发行版相关的配置文件,此分支开放在我的github repo供观众老爷们参考
    • 各个发行版在master分支的基础上增加其对应配置文件并同步于其对应分支
    • master独立更新,各发行版分支基于masterrebase并更新
  • syncthing部分
    • 使用syncthing同步sync文件夹的txt文件,这里我通过在sync/.stignore文件中添加*.yaml来忽略所有配置文件,结果上来说实现了只同步词库的目的
    • 各平台的sync文件夹的用户词库都通过对应输入法的同步+部署更新用户词库

这对我来说有几个好处:

  1. 使用git更利于我进行版本管理(至少配置trime时不再会动不动删档重开)
  2. 不需借助syncthing/nextcloud/onedrive等工具就能实现多端同步 现在借助了

但这种方案也有几个已知不足之处,观众老爷们如果有更好的方案欢迎评论区留言:

  1. 由于使用了rebase,各发行版分支在push/pull时往往需要使用-f参数来强制推送/拉取,这不够优雅
  2. xxx.userdb目录,即用户输入历史不方便同步,使用git lfs等方案也可能导致repo不必要的臃肿 感谢syncthing