2018-11-12

WSLでMozcで日本語入力

できるの・・・?

WSL(Windows Subsystem for Linux/旧Bash on Ubuntu on Windows)でGUIアプリ使う場合に気になること。GUIでLinuxのアプリを動かすのはXサーバを起動して環境変数DISPLAYを0:0とかに設定、というのはssh -XでGUIを引っ張ってくる時もやるので同じスキームでできそうだなという見当は付くものの、この方法でいっつも引っかかるのは

  • クリップボード経由のコピペ
  • 日本語入力(IMを経由した入力)

という定番があり、アルファベットだけで生きていけない言語話者としては常用するにあたりクリティカルな問題として常に横たわっていました。
が、どうもググるとWSLでMozc使って日本語入力が可能っぽいということで、作業ログ及びご紹介です。
尚、WSL用のターミナルはWSL Terminalを使っています。

WSL側で準備

関連パッケージのインストール

WSL側でフォント、X関連含めてインストール。インストールするフォントはお好みで。
# apt-get install fcitx-mozc
# apt-get install fonts-vlgothic fonts-mmcedar fonts-motoya-l-cedar fonts-motoya-l-maruberi
# apt-get install dbus-x11 x11-xserver-utils

実行準備

実行ユーザのUUIDを書き込み。
$ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"
(これしないとエラーが出ます
dbus[4934]: D-Bus library appears to be incorrectly set up: see the manual page for dbus-uuidgen to correct this issue. (Failed to open "/var/lib/dbus/machine-id": No such file or directory; UUID file '/etc/machine-id' should contain a hex string of length 32, not length 0, with no other text)

環境変数設定

必要な環境変数をまとめたファイル~/.xenvをWSL側のホームディレクトリに作成(本当は~/.profileに書きたいのだけどWSL Terminalからbash起動した場合に~/.profileを読み込まないため。--loginを付けてbashを起動すればいいらしいのだけどそうじゃないだろと…)
export DISPLAY=localhost:0.0
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
今回だけ手動読み込み(次回以降WSLログインで読み込み)
$ . .xenv

尚、次回以降の起動用に~/.bashrcの末尾に.コマンドを追記。これで次回以降は気にする必要なし。
. ~/.xenv

Windows側でXサーバ/VcXsrvのインストール

vcxsrv-64.1.20.1.3.installer.exeでインストールしました。デフォルトのままFullで。
インストール後、デスクトップにできたXLaunchを実行、Select display settingsはデフォルトのMultiple windowsを選択し次へ、Select how to start clientsもデフォルトのStart no client。Extra settingsもデフォルトのままClipboardとNative openglで。タスクトレイにアイコン表示で起動。

WSL側でFcitx起動・設定

$ fcitx-autostart
毎回GUI起動時に実行しなければならないが.profileに書いてしまうとXサーバがいない場合.profileを抜けないらしいのでとりあえず手動で実行することにします。
諸々表示されますがecho $?して0なら問題なし。ならない場合はXサーバが起動されてるか確認。
問題なければ
$ fcitx-config-gtk3
fcitx-autostartを実行しない場合は空で表示されるので閉じてfcitx-autostart。ここにMozcを追加するので左下の+をクリック。
Mozc選んでOK。
Global Configを選んでとりあえずTrigger Input Methodを変えます。何か色々安定しないので全角半角以外、Ctrl+SpaceはEclipseの補完入力と被るので普段使わないキーバインディングに変えます。変え終わったら閉じ。

文字入力の出来るアプリを適当に実行して確認します。私の場合普段がMATE使いなのでPlumaとかCajaとかで。
とりあえずうまくいったことにします。

Mozcの設定(任意)

Xサーバが起動している状態で、徐に以下を実行。
$ /usr/lib/mozc/mozc_tool --mode=config_dialog
私の場合はATOKキーマップが一番いいのでMS-IMEから変更します。

fcitx-autostart実行設定を.xenvに追記

Windows側でVcXsrvが起動してたらログイン時(WSL Terminal実行時)にfcitx-autostartコマンドを実行するようにします。
Xサーバの死活監視ってどうやればいいかな?6000番からTCPでnetstat開いてるか見るかな?とも思ったんですが、Build14951以降のWSLではWSLからWindowsプログラムを実行できるようになってるので、これを利用して「VcXsrvが起動してるかどうかをtasklistコマンドで確認して動いてればfcitx-autostartを実行」を書いてしまおうと思います。

~/.xenvに以下を追記
if [ $(/mnt/c/Windows/System32/tasklist.exe | grep vcxsrv | wc -l) -gt 0 ] ; then
        echo "vcxsrv exists. fcitx-autostart execute."
        fcitx-autostart
else
        echo "vcxsrv does not exist. do nothing."
fi
色々と力づくなのは承知しており、以下の懸念があるのは言わずもがなです。
  • tasklistコマンドの位置がWindows/System32の下にあることが将来的に保証されない
  • tasklistコマンドで表示した場合のVcXsrvプロセスが小文字のvcxsrv.exeであることが将来的に保証されない
  • VcXsrv以外のプログラムで「vcxsrv」を含むプロセスがwindowsで動作していると誤検知する
ただ、手軽にさっとできるのはこの程度とは思っています。変更があれば修正したいですね。
また、fcitx-autostartの出力が邪魔という場合は > /dev/null 2>&1を後ろにつけてもいいと思います。

まとめ

  • WSL側で必要パッケージをインストール
  • VcXsrvをインストール
  • WSL側で環境変数、実行プログラム等準備
  • Have a Happy Mozc on WSL Life!

補足

何か調子がおかしい場合
  • 入力中のGUIアプリを保存して閉じて、fcitx-autostartを実行する
  • fcitx-config-gtk3を実行して、Mozcがある(一番上にある)事を確認
  • どうしてもおかしかったらXサーバを再起動してfcitx-autostartからやり直す
  • fcitx-config-gtk3の中でKeyboard-EnglishがあってIM切り替えでMozcを外した時にEnglishに切り替わる場合、キーボードレイアウトが英語キーボードになるっぽいのでいっそ消した方が幸せかもしれない