Vim と asyncomplete を使って IME を作った。
Vim には coc.nvim という拡張があり、Visual Studio Code の拡張のコードをふんだんにパク利用して node.js のプロセスとして動作する Vim プラグインがあるのですが、一昨日その coc.nvim から使える coc-rime という拡張を見付けました。
※画像はリポジトリから拝借
どうやら中国ではそこそこ有名な rime という IME があり、その API を利用している様です。仕組みを追ってみると rime-cli というコマンドラインプログラムを使い、rime と対話しているのが分かりました。
この rime-cli というプログラムの標準入力にタイプしたキーを与えると、変換結果が標準出力で返されるという物です。なかなか面白いなと思ったので、SKK で実現できないか実験してみました。実装に必要な物としては2つ。
- SKK の入力を与えると変換結果が返ってくる CLI
- このプログラムを制御して IME の様に振る舞う機能
前者は Go で作りました。
標準ではプロンプトによる対話モードになっており -json
フラグを付ける事で JSON による対話になります。
:::message info
SKK を知らない人に軽く説明すると、SKK は東北大学教授の佐藤雅彦氏(現京都大学名誉教授)によって開発された日本語入力システムで、多くのプラットフォームで多くの変換エンジンが実装されています。入力方法は少し特殊で、自らが送り仮名を指定して短文節で区切って入力していくため誤変換がないという特色があります。UNIX 出身者に根強い人気があり、今も尚使い続けられています。
:::
skk-cli は UNIX であれば ~/.config/skk-cli/SKK-JISYO.L
を置いておく必要があります。Windows の場合は %APPDATA%\skk-cli\SKK-JISYO.L
になります。
コマンド単体で動く事を確認できたら導入成功です。
後者は asyncomplete という Vim プラグインに乗っかって作りました。作者は VimConf 2019 にも登壇された Prabir Shrestha 氏です。vim-lsp の作者としても有名ですね。
asyncomplte には補完拡張を作る為の API が用意されているので、その API に従って作っていけばいいだけです。
README.md
に書かれている通り、IME をオンオフする為のキーの設定が必要です。
imap <c-\> <plug>(asyncomplete-skk-toggle)
この場合は CTRL-\
です。
SKK とは言えど、カナモードや直接入力モード、学習機能等がないので実用的ではありませんが、実験としてはひとまず成功と言えると思います。
もし実用的にしたいという方がいれば、ぜひ pull-request を送って下さい。
Discussion