この記事は 六間坂上 Advent Calendar 5日目 の記事です。
Windows + WSL環境の開発は面倒がつきもの
こんにちは、ここのえです。もう表題の通りです。
一般的にはWeb開発を行う際、macosかLinuxをメインで使う人類が大半だと思います。ですが私のように、macosはあるけどパワーのあるマシンは持ってないとか、無限枚ディスプレイ繋げたいとか、HDMIケーブルを抜き差しするのが面倒だとか言う理由で、Windowsとかいうゲーム機でWeb開発を行いたい人も少なからずいるのではないでしょうか。
今はWindowsにも WSL とかいう魔法のアイテムが存在するので、いちいちVirtualboxやらVagrantやらを立ち上げる必要はなくなりました。また私がこよなく愛してやまない Jetbrains IDE でも、当然WSLは包括的にサポートされており、常識的な範囲で触る分には全く支障を感じる事はないでしょう。
ところがどっこい、サードバーティ製プラグインを使うとなると、途端に話が変わってきます。まさに今この記事を書いた原因なのですが、昨年のアドカレ辺りから目を付けていた biomejs ですが、サポート言語も広がってきており、そろそろうちのプロジェクトに導入しようと考えました。ただJetbrains IDE向けのプラグインを使用した際、WSL内のパッケージを参照できないというIssueを抱えています😢
このIssueに関してはDockerも同様なのですが、ホストOS外のパッケージを読めないという問題があるようです。とはいえこんなのは氷山の一角で、WSL絡みの問題は今まで大量に踏み抜いてきていますし、その度にプラグインの問題に対して原因究明するのはあまりにも不毛です。
「じゃあデュアルブートすればいいのでは?」というのがこれまでの通説でしたが、最近のWindowsは大変香ばしいOSですので、こういったトラブルを発生させます。なのでその手も通用しなくなりました。
かくなる上は Jetbrains Gateway でWSL内にリモート接続するという事になるのですが、はっきり言ってかなり入力にラグがあり、たいへんストレスフル。Linterが遅延して書いてる最中に赤波線だらけになることもしばしばあります。そしてこうなります↓
(눈_눈) 1
もう全部WSL内で動かしてしまえ
残る選択肢はただ一つ、もう全部WSL内で動かしてしまいましょう。この手に限る。こうなればもうIDEの動作も何もかもUbuntu上で動いているだけなので、何の問題もなくなります。しかも幸いなことに、今のWSL環境には WSLG があるのでGUIも無問題です。
ということで、今回は以下の環境でWindowsからLinux GUIアプリケーションを無理矢理起動してJetbrains IDEをUbuntu内で動作させてみます。
- Windows 11
- Ubuntu 24.04 LTS (WSL2)
Jetbrains Toolboxの導入
ここからが本番です。Jetbrains Toolboxを公式サイトから落としてきます。何やら jetbrains-toolbox-install
なるものもあるようですが、非公式なので何かの拍子に動かなくなったりしそうです。今回は素直に公式サイトを開いて、ダウンロードリンクを拾ってきます。
# バージョンは変わるので、公式サイトからダウンロードリンクをコピーしてください
wget https://download.jetbrains.com/toolbox/jetbrains-toolbox-2.5.2.35332.tar.gz
tar xvf jetbrains-toolbox-2.5.2.35332/jetbrains-toolbox
ダウンロードしたら起動します。
cd jetbrains-toolbox-2.5.2.35332
./jetbrains-toolbox
表示されたら成功です。右上の設定ボタンからログインしておきましょう。
この認証の過程でToolboxは xdg-open
を使用しますが、apt install xdg-utils
して試してみても、WSL上のUbuntuではブラウザログイン後に正常にログイン認証がToolbox側に帰ってこないようです。そのため Troubleshoot...
を押して、トークンで認証を行います。ブラウザはWindows側のものを使いましょう。
今回の目的はWebstormなので、インストールしておきます。
日本語表示ができるようにする
日本語をコメントを一切読み書きしないストロングスタイルでもいいのですが、さすがに表示ぐらいはできるようにしておきます。フォントにはNoto Fontを入れておきます。”Noto”の名前はNo Tofuが由来だったりします。これで表示はできるようになりました。
sudo apt install fonts-noto-cjk
必要ならロケール設定を日本語にしてください。
sudo localectl set-locale LANG=ja_JP.UTF-8
fcitx5-mozcは不完全だが動かせなくもない
さて、問題は入力系です。王道を往く fcitx5-mozc
を入れますが、これがWSL2の非デスクトップ環境ではかなり困ったことになります。結論から言うと動作は不完全です。入力時に変換を確定するまで、日本語が表示されません。気になるという場合は設定せず何となく記事を流し見していただければ結構です。
ひとまず fcitx5-mozc
をインストールします。
sudo apt install fcitx5-mozc
.bashrc
や .zshrc
など、起動時に読み込むスクリプトに以下の環境変数を追加します。
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
xset -r 49
一旦WSLを再起動します。その後、 fcitx5-configtool
を開きます。
fcitx5-configtool
現時点ではfcitx5が起動していないので、Run Fcitx 5
ボタンを押して起動します。
Available Input Methodの中で Keyboard - Japanese
と mozc
を検索して左矢印でグループに追加します。英字キーボード配列が不要なら Keyboard - English (US)
は削除しましょう。
また並び順も下の通りにしておきます。Mozcが上だと初期状態が全角モードになってしまい、まあまあ不便です。これで設定完了です。設定が完了したら OK or Applyを忘れずに。
Webstormを起動して日本語入力をします。これで日本語入力ができるようになりました!しかし入力中(変換完了前)の文字列が表示されていません……が、これはどうにもなりません😢 ちなみにこれはFcitx5の典型的なCtrl + Alt + P問題ではないため、ショートカットを押しても解決はしません。
ちなみにこれはJetbrains IDE固有の現象のようで、エンジンがGTKやQTではなく、Swingベースなので何かその辺りが悪さしているのかもしれません。fcitx5のwikiやJetbrains IDEのQ&A、Archwikiを見るとロケール設定がちゃんとされていないとトラブルが起きるようですが、ja_JP.UTF-8
に設定してもダメなので別の要因がありそうです。Experimentalで一応存在しているWaylandモードでも試したかったのですが、Ubuntu 24.04 + WSL環境でWaylandが動かない問題があり、残念ながら見送りました。
【未解決】fcitx5の自動起動における不可解な挙動
2回目以降はfcitx5を自動起動したいですね。.bashrc
に書き込むにあたり、調べてみると様々なサイトで似たようなスクリプトが紹介されています。
while true; do
dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY 2> /dev/null && break
done
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
if [ $SHLVL = 1 ] ; then
(fcitx5 --disable=wayland -d --verbose '*'=0 &)
xset -r 49 > /dev/null 2>&1
fi
今のWSL2 + Ubuntu 24.04環境でこれを行った場合、前述の記事でも指摘されているように、変換候補パネルが表示されないなどの不具合が発生します。そして、この状態でWebstormでfcitx5を使った入力をしようとした場合、正常に動作せず、全角/半角の切り替えが行えず日本語入力ができません。
初めは「どうせdbusが立ち上がる前に起動してるんだろう」と高を括っていたのですが、そう簡単な問題でもありませんでした。一例として、下記のようなユーザ用サービス(~/.config/systemd/user/fcitx5.service
)を組んでsystemdに読み込ませても、同じ状況になり問題は解決しません。
[Unit]
Description=fcitx5
After=default.target dbus.service
[Service]
Type=simple
ExecStart=/usr/bin/fcitx5
Restart=no
Environment=GTK_IM_MODULE=fcitx
Environment=QT_IM_MODULE=fcitx
Environment=XMODIFIERS=@im=fcitx
[Install]
WantedBy=default.target
また困ったことに、同環境では .xinitrc
も .xprofile
も読み込まれません。前は動いていたような気がするので、Ubuntu 24.04特有のバグの可能性もあります。そのためX11セッションが立ち上がる瞬間まで起動を遅らせるのも無理そうです。
今の所見つけられた解決策としては、シェル起動後に自分で手動で立ち上げる方法です。
# 起動後に
fcitx5 &
# or
# 前述のスクリプトと同様に、これでも正常に動きます。めんどくさいので上記コマンドで起動してます。
# どうせWSL + Ubuntu 24環境でWaylandが動かないので……Waylandをカットする意味もあまりありません
fcitx5 --disable=wayland -d --verbose '*'=0 &
これで動くなら .bashrc
に記述しても動くのでは?と思うのですが、どうも動いてくれません。ここからは完全に邪推ですが、WSLGの起動タイミングが完全にシェルが操作可能になった後という感じなのでしょうか?とはいえ、毎回起動後に systemctl --user start fcitx5.service
しても同様のトラブルになるので、それだけではなさそうです。デーモンではダメ、かつ起動タイミングも条件がある……という都合のいい話は流石になさそうなので、別に問題がありそうな気がしますが、残念ながら記事執筆時点では原因の究明には至りませんでした……。
まとめ
未解決問題も残ってしまい、釈然としないので記事にするか迷っていたのですが、Jetbrains IDE in WSLな環境で日本語入力できる方法が紹介されている記事は見当たらなかったので投稿した次第です。この場合Gatewayを経由した場合と違い、パフォーマンスも問題ないレベルで動作するので十分実用性はあるかと思います(手動起動の手間を除けば……)。
現状ではこれ以上の解決策を見つけられそうにないので、また何か発見したら更新します。もしいい解決策があったら教えて頂けると幸いです。
コメント