ということで mecab-skkserv をビルドする。
mecab 本体のビルド
まず mecab 本体を落としてきて普通にビルドする。特に記すことはない。このページで提供されている辞書は mecab-skkserv には不要なので作っても作らなくてもいい。
https://taku910.github.io/mecab/
mecab-skkserv のビルド
http://chasen.org/~taku/software/mecab-skkserv/
おそらく幾つかの点でコンパイルエラーになるので
- mecab-skkserv.cpp で getopt.h を #include している箇所を削除
- dicrc に cost-factor = 700 とかを追記する(値は700〜800で任意とのこと)
等々を施す必要があるだろう。ちなみにビルドの際に辞書も構築されるが、特に ./configure で指定しなければ euc-jp エンコーディングになる。
systemd ユニットの作成
mecab-skkserv 本体のインストールまで済んだら次は xinetd か tcpserver に登録することになっているが、2020年の現在はそれらではなく systemd の話になる。以下のファイルを新規作成する。
/etc/systemd/system/mecab-skkserv.socket ファイル
[Unit]
Description=mecab-skkserv socket
[Socket]
ListenStream=1178
Accept=yes
[Install]
WantedBy=sockets.target
/etc/systemd/system/mecab-skkserv@.service ファイル
[Unit]
Description=mecab-skkserv service
Requires=mecab-skkserv.socket
[Service]
Type=simple
ExecStart=/usr/local/bin/mecab-skkserv
StandardInput=socket
StandardError=journal
[Install]
WantedBy=multi-user.target
systemd に対して有効にする。この有効化はマシン再起動をまたいでも永続的である。
$ systemctl enable mecab-skkserv.socket
$ systemctl start mecab-skkserv.socket
$ systemctl status mecab-skkserv.socket
この設定だと外のマシンからの接続も受け付けるので、拒否する必要があるなら iptables とかのレベルでうまいことする。
この状態でちゃんと動いてるかどうかは例えば
$ echo "2 " | nc localhost 1178
などとして確認できる。mecab-skkserv のバージョン情報が返ってくればとりあえず接続の受付と起動は正常。
fcitx-skk に対して mecab-skkserv を辞書として登録する
~/.config/fcitx/skk/dictionary_list に以下の行を追加
type=server,host=localhost,port=1178
このファイルでは辞書の指定の順番が重要な気がするが、SKK_JISYO.* の上に置く場合と下に置く場合でどう違うのかは試してない。
また、上記の通り普通に mecab-skkserv をビルドすると euc-jp エンコーディングの辞書が構築される。skkserv プロトコル自体が euc-jp で動くことになっているのでそれで正しいのだが、絵文字など unicode でしか表現できない文字を辞書に含めることができなくなる。その場合辞書を utf-8 で構築し、dictionary_list には
type=server,host=localhost,port=1178,encoding=UTF-8
などと指定すれば良い。
あとは fcitx を再起動すれば普通に使えるようになる。素の SKK だと Watashi<spc>noNamae<spc>haNakano<spc>desu. などと打っていたものが Watashino<spc>Namaeha<spc>Nakanodesu. くらいまでシンプルになる。いやこれはあんまり良い例じゃないな。とにかく送り仮名を気にする必要がほとんどの場合なくなる。
困った点としては
- skkserv の向う側の辞書は一切変換の学習をしない。学習を skkserv 辞書にフィードバックする仕様自体がプロトコルにない?
- たまにキー押下からレスポンスが返ってくるまで数十秒かかる状態に陥ることがある。たまにというか今まで1回だけそうなった。原因不明
- 素の SKK に比べると、変換のレスポンスはほんのわずかに遅れる感じはする。ほんの0.1〜0.2秒ほど。慣れの範囲だろう
とはいえ普通に快適なので、当分 mozc を使うことはないだろう。