由于我习惯写中文博客,所以将写博客这件事也转移到 Emacs 后,我渐渐感觉到 pyim 的不足。所以今天研究一下如何让 pyim 调用 Rime 的词库。

基础配置

  1. 首先安装鼠须管,此一节可见 鼠须管傻瓜化配置,一句话概括呢就是:

    1
    
    brew cask install squirrel
  2. 然后参考前人经验,下载 librime 获取源码并从鼠须管中获取编译好的 librime.dylib:

    1
    2
    3
    4
    5
    
    cd ~
    git clone --recursive https://github.com/rime/librime.git --depth=1
    mkdir -p ~/librime/xbuild/lib/Release/
    cp /Library/Input\ Methods/Squirrel.app/Contents/Frameworks/librime.1.dylib ~/librime/xbuild/lib/Release/librime.dylib
    sudo cp /Library/Input\ Methods/Squirrel.app/Contents/Frameworks/librime.1.dylib /usr/local/lib
  3. 然后下载并编译 liberime,需要提前安装 cmake 库来进行编译:

    1
    2
    3
    4
    
    git clone https://gitlab.com/liberime/liberime.git --depth=1
    cd ~/liberime
    export RIME_PATH=~/librime
    make liberime
  4. 然后需要在 emacs 中安装 pyim,此一节详见 Emacs 中文环境配置 ,当然不看也行,毕竟具体设置在本篇中需要推倒重来; M-x package-install RET pyim RET

  5. liberime.so 动态库存至 pyim 文件夹中:

    1
    
    cp ~/liberime/buid/liberime.so ~/.emacs.d/pyim/

初试啼声

接下来就是添加 emacs 对于 liberime 的配置,我先想当然地试了这个配置:

1
2
3
4
(liberime-start (expand-file-name "~/Library/Rime")
                (expand-file-name "~/.emacs.d/pyim/rime/"))
(liberime-select-schema "terra_double_pinyin_mspy")
(setq pyim-default-scheme 'rime)

这个方法有几个问题,一是哪怕我在设置中采用了简体,输出依然为繁体字;二是不支持分号与声调,所以在微软双拼中不能输入元音为 ing 的字,也不能通过声调来选词;三则是由于引入了诸多词库,打字特别卡顿。

再接再厉

然后我可以通过添加新的 schema 来提供对分号的支持,但是声调比较麻烦。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
(add-to-list
 'pyim-schemes
 '(rime-mspy
   :document "support ;"
   :class rime
   :first-chars "abcdefghijklmnopqrstuvwxyz"
   :rest-chars "abcdefghijklmnopqrstuvwxyz;"
   :prefer-trigger-chars nil
   ))

(liberime-start (expand-file-name "/Library/Input Methods/Squirrel.app/Contents/SharedSupport")
                (expand-file-name "~/.emacs.d/pyim/rime/"))
(liberime-select-schema "double_pinyin_mspy")
(setq pyim-default-scheme 'rime-mspy)

但是我发现只要改回共享库,打出来的就是简体,但是我不明白为什么只能使用共享库,却不能使用个人库,毕竟我还魔改了我的鼠须管呀,万一我想打 emoji 呢,万一我想引用个古诗词呢?

最终解决方案

一番折腾之后,终于找出了合适的方案:

  • 个人库无法显示繁体的原因其实很简单,由于鼠须管默认将 opencc 开放中文转换库 放在共享库中,所以个人库中并不包含 opencc,这样 build 的时候就不能调用这些转换文件。所以,一行代码搞定。

    1
    
    ln -s /Library/Input\ Methods/Squirrel.app/Contents/SharedSupport/opencc/* ~/Library/Rime/opencc/
  • 输入分号的问题前面通过调用新写的 schema 解决,但是声调问题比较麻烦。由于 pyim 作者给减号键(我用作平声调的)赋予了太多用途,我这半调子 lisp 水平一时半会儿也写不了一个新的函数使此键在非后翻页状态作为简单的 pyim-self-insert-command ,而且还得把后面那个函数改了,事情实在太多,所以我将方括号改作翻页,并将长得差不多的等号键用作平声。以后有时间,可能还是会把它改回减号键,毕竟长得更像一点。

  • 其次则是卡顿的问题。我发现当 liberime build 时,由于在个人库中已经有过 build 好的文件,所以不会在 liberime 的库中重新 build 一份,这样非常影响速度。所以我复制了一份我写的地球双拼给 liberime 专用(yaml 文件见这儿),效果拔群。

具体配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(require 'use-package)
(use-package pyim
    :ensure nil
    :demand t
    :config
    (setq default-input-method "pyim")
    (setq pyim-page-length 9)
    :bind
    (:map pyim-mode-map
          ("]" . pyim-page-next-page)
          ("[" . pyim-page-previous-page)
          ("-" . pyim-self-insert-command)
          ("=" . pyim-self-insert-command))
    )
(use-package liberime
    :load-path "~/.emacs.d/pyim/"
    :config
    (liberime-start (expand-file-name "~/Library/Rime/")
                    (expand-file-name "~/.emacs.d/pyim/rime"))
    (liberime-select-schema "terra_double_pinyin_pyim")
    (add-to-list
     'pyim-schemes
     '(rime-mspy
       :document "support ;"
       :class rime
       :first-chars "abcdefghijklmnopqrstuvwxyz/"
       :rest-chars "abcdefghijklmnopqrstuvwxyz;=/,\\"
       :prefer-trigger-chars nil
       ))
    (setq pyim-default-scheme 'rime-mspy)
    )

另外,我在 ~/.emacs.d/pyim/rime/ 文件夹中添加了 pyim 作者推荐的优化配置文件 default.custom.yaml ,详见其 github

1
2
3
4
5
6
patch:
  schema_list:
    - schema: terra_double_pinyin_pyim
  "menu/page_size": 50
  "speller/auto_select": false
  "speller/auto_select_unique_candidate": false