Chunliang Lyu

I am a developer and researcher from China. Love to make fun and useful stuff. Co-founded Hyperlink.

RIME输入法使用

Rime(中州韻)输入法闻名已久,一直没有尝试。今天看到有人说Rime有个功能是当你切换到某些指定的应用之后,Rime可以自动切换成英文状态。这个功能对我很有吸引力,因为经常在微信和终端之间切换,到了终端之后还得切换输入法,很不方便。于是就尝试了一下Rime。

Rime的安装很简单,总体来说上手比较容易,毕竟只是一个输入法。自己的一个需求是要把联系人的中文名导入自定义词典中。本来以为是个挺容易的任务,但一方面资料比较少,而另一方面Rime的文档也是用拗口的半现半古的中文来写的,读起来还是有些吃力,还是花费了一些时间。这篇文章希望能给后来的人省点时间。

基本配置

Rime官方的OSX应用没有图形界面的配置程序,需要直接编辑yaml的配置文件来修改设置。另外一个项目[SCU](https://github.com/neolee/SCU)提供了简单的图形配置程序,安装之后可以简单地看一下系统都提供了哪些配置,在此基础之上再看配置文件要简单一些。

本文主要针对Mac OS上的Rime进行配置,其它系统会稍有不同。Rime的用户配置文件在~/Library/Rime文件夹中,配置文件格式为yaml。用户配置文件夹中会有很多.table.bin, .reverse.bin, .prism.bin的文件,是相应拼音方案编译之后生成的文件,不必理会。编译是通过Rime菜单中的Deploy进行,或者可以通过一下脚本:

$ # Rime Deploy
$ DYLD_LIBRARY_PATH="/Library/Input Methods/Squirrel.app/Contents/Frameworks" "/Library/Input Methods/Squirrel.app/Contents/MacOS/rime_deployer" $@

Rime的词库有两种,首先是输入系统自带的系统词库,用户在使用过程中也会产生词库,包括选词的频率,用来学习和预测用户将来的输入。对应地也就有两种方案可以导入自定义词库,一种是用系统自带的rime_dict_manager来导入到用户词库,另外一种是将自定义词库导入输入方案词库。下面会分别来介绍两种方案的实现。

用户词库导入

第一种方案比较简单,Rime提供了一个命令行工具来导入用户词库。首先编辑一个词库文件,每行标注词条及其拼音,比如cllu_pinyin.txt:

你好	nihao

注意词条和拼音之间以TAB分隔,然后执行导入操作:

$ cd $HOME/Library/Rime
$ DYLD_LIBRARY_PATH="/Library/Input Methods/Squirrel.app/Contents/Frameworks" "/Library/Input Methods/Squirrel.app/Contents/MacOS/rime_dict_manager" $@ -i luna_pinyin cllu_pinyin.txt

执行完成之后会有imported 1 entries.的输入告诉你导入成功,这时候再进行编译即可。

建立自定义输入方案

另外一种方式是嵌入到输入方案(Schema)的固态词典中,要么修改已有的输入方案,要么建立自己的输入方案。本着自己动手丰衣足食的原则,我是选择建立自己的输入方案,Rime的文档有详细的解释,不过简单的方法就是复制已有的方案,在其基础之上修改。

下面的源文件位于gist上:https://gist.github.com/cllu/dc0ec896b9b5152ca7e6

以系统自带的”朙月拼音-简体”为基础,复制luna_pinyin.schema.yamlcllu_pinyin.schema.yaml,至少需要修改两处:

  • 修改schema/schema_idcllu_pinyin,这是系统内部的输入方案标识,需要保证唯一性
  • 修改translator/dictionarycllu_pinyin,指定自定义词库

新建一个词库文件cllu_pinyin.dict.yaml,内容如下:

# Rime dictionary
# encoding: utf-8

---
name: cllu_pinyin
version: "2014.12.24"
sort: by_weight
use_preset_vocabulary: true
# import dict from luna_pinyin.dict.yaml
import_tables:
  - luna_pinyin
...


朙月	ming yue	1000
朙月	my
朙月

词库的相关信息以yaml格式定义,以---开始,以...结束。定义词库的时候可以引入其他的词库,比如再上述的文件中我们引入了朙月拼音自带的词库文件luna_pinyin.dict.yaml。在yaml部分结束之后就是词条的定义,每行一个词条,以Tab分割可以依次定义词语,相关的编码(不限于拼音),以及词频。其中词频为可选项。如果不包含多音字或者相应读音词频较高的话,编码也可以省略,输入法会自动生成。

有了这两个文件我们的输入方案就搞定了,在default.custom.yaml中启用我们的输入方案:

patch:
  schema_list:
  - schema: cllu_pinyin

然后点击输入法菜单的Deploy进行编译,完成之后可以看到用户配置文件夹中多了cllu_pinyin.table.bin, cllu_pinyin.reverse.bin, cllu_pinyin.prism.bin几个文件,就说明编译成功。如果不成功的话,相应的日志在$TMPDIR/rime.squirrel.{INFO,WARNING,ERROR}文件中,可以用来查错。

总结

两种方式对比,第一种方案更为简洁,第二种方案不需要提供词条的拼音。推荐第二种方案的原因是,在输入方案配置的过程当中可以对Rime的整体架构有所了解,总体来说这是设计不错的开源软件。

---

PS: 附上从Google Contacts导出的csv文件中提取中文姓名的Python脚本:

#!/usr/bin/env python3
 
import csv
import re
 
chinese_re = re.compile('[\u4e00-\u9fa5]+')
 
names = []
with open('contacts.csv', encoding='utf-16') as f:
    content = csv.DictReader(f)
    for row in content:
        name = row['Name']
        if name and chinese_re.search(name):
            names.append(name)
 
with open('names.txt', 'w') as f:
    for name in names:
        f.write('%s\n' % name)

把生成的names.txt文件内容拷贝到词库文件中,重新Deploy即可。