Jetbrains IDE in WSLで面倒を避けたかったが、余計面倒になった

Programming

この記事は 六間坂上 Advent Calendar 5日目 の記事です。

Windows + WSL環境の開発は面倒がつきもの

こんにちは、ここのえです。もう表題の通りです。

一般的にはWeb開発を行う際、macosかLinuxをメインで使う人類が大半だと思います。ですが私のように、macosはあるけどパワーのあるマシンは持ってないとか、無限枚ディスプレイ繋げたいとか、HDMIケーブルを抜き差しするのが面倒だとか言う理由で、Windowsとかいうゲーム機でWeb開発を行いたい人も少なからずいるのではないでしょうか。

今はWindowsにも WSL とかいう魔法のアイテムが存在するので、いちいちVirtualboxやらVagrantやらを立ち上げる必要はなくなりました。また私がこよなく愛してやまない Jetbrains IDE でも、当然WSLは包括的にサポートされており、常識的な範囲で触る分には全く支障を感じる事はないでしょう。

ところがどっこい、サードバーティ製プラグインを使うとなると、途端に話が変わってきます。まさに今この記事を書いた原因なのですが、昨年のアドカレ辺りから目を付けていた biomejs ですが、サポート言語も広がってきており、そろそろうちのプロジェクトに導入しようと考えました。ただJetbrains IDE向けのプラグインを使用した際、WSL内のパッケージを参照できないというIssueを抱えています😢

Biome plugin not working with WSL · Issue #49 · biomejs/biome-intellij
I tried to use the plugin with a project in Windows Subsystem for Linux. I couldn't get it to work and tried to gather s...

このIssueに関してはDockerも同様なのですが、ホストOS外のパッケージを読めないという問題があるようです。とはいえこんなのは氷山の一角で、WSL絡みの問題は今まで大量に踏み抜いてきていますし、その度にプラグインの問題に対して原因究明するのはあまりにも不毛です。

「じゃあデュアルブートすればいいのでは?」というのがこれまでの通説でしたが、最近のWindowsは大変香ばしいOSですので、こういったトラブルを発生させます。なのでその手も通用しなくなりました。

WindowsのアップデートによりLinuxとのデュアルブートが不可能になったとの報告
Microsoftは2024年8月14日に、セキュリティ更新プログラムやバグ修正が配信されるWindows Updateを行いました。このアップデートによりWindowsとLinuxの両方を実行するように構成されたデバイスが起動できなくなっ...

かくなる上は Jetbrains Gateway でWSL内にリモート接続するという事になるのですが、はっきり言ってかなり入力にラグがあり、たいへんストレスフル。Linterが遅延して書いてる最中に赤波線だらけになることもしばしばあります。そしてこうなります↓

(눈_눈) 1

もう全部WSL内で動かしてしまえ

残る選択肢はただ一つ、もう全部WSL内で動かしてしまいましょう。この手に限る。こうなればもうIDEの動作も何もかもUbuntu上で動いているだけなので、何の問題もなくなります。しかも幸いなことに、今のWSL環境には WSLG があるのでGUIも無問題です。

WSL で Linux GUI アプリを実行する
WSL で Linux GUI アプリの実行がどのようにサポートされるかについて説明します。

ということで、今回は以下の環境でWindowsからLinux GUIアプリケーションを無理矢理起動してJetbrains IDEをUbuntu内で動作させてみます。

  • Windows 11
  • Ubuntu 24.04 LTS (WSL2)

よく来たな。これをGentooで動かしたいと思うやつこそ真の男だ。昨年のおれのアドカレの記事を見てメキシコに旅立ってくれ。2

Gentoo Install Battle for WSL2 - Qiita
この記事は ここのえ Advent Calendar 2023 Day 13 の記事です。Intro普段の開発は「画面がデカい」とかいう至極単純な理由で、Windowsのデスクトップを使っていま…

Jetbrains Toolboxの導入

ここからが本番です。Jetbrains Toolboxを公式サイトから落としてきます。何やら jetbrains-toolbox-install なるものもあるようですが、非公式なので何かの拍子に動かなくなったりしそうです。今回は素直に公式サイトを開いて、ダウンロードリンクを拾ってきます。

JetBrains Toolbox App:ツールを簡単に管理
あらゆるIDEのあらゆるプロジェクトをワンクリックで開くことができます。
ShellScript
# バージョンは変わるので、公式サイトからダウンロードリンクをコピーしてください
wget https://download.jetbrains.com/toolbox/jetbrains-toolbox-2.5.2.35332.tar.gz
tar xvf jetbrains-toolbox-2.5.2.35332/jetbrains-toolbox

ダウンロードしたら起動します。

ShellScript
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が由来だったりします。これで表示はできるようになりました。

ShellScript
sudo apt install fonts-noto-cjk

必要ならロケール設定を日本語にしてください。

ShellScript
sudo localectl set-locale LANG=ja_JP.UTF-8

fcitx5-mozcは不完全だが動かせなくもない

さて、問題は入力系です。王道を往く fcitx5-mozc を入れますが、これがWSL2の非デスクトップ環境ではかなり困ったことになります。結論から言うと動作は不完全です。入力時に変換を確定するまで、日本語が表示されません。気になるという場合は設定せず何となく記事を流し見していただければ結構です。

ひとまず fcitx5-mozc をインストールします。

ShellScript
sudo apt install fcitx5-mozc

.bashrc.zshrc など、起動時に読み込むスクリプトに以下の環境変数を追加します。

ShellScript
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
xset -r 49

xset -r 49 で全角半角キーのキーリピートの設定を無効化しています。なぜか全角半角キーが一回押した後押しっぱなし状態で判定されることがあり、表示がえらいことになるのでその対策です。情報を漁っていくと、Virtualboxの環境でも過去にあったようです

一旦WSLを再起動します。その後、 fcitx5-configtool を開きます。

ShellScript
fcitx5-configtool

現時点ではfcitx5が起動していないので、Run Fcitx 5 ボタンを押して起動します。

Available Input Methodの中で Keyboard - Japanesemozc を検索して左矢印でグループに追加します。英字キーボード配列が不要なら 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 に書き込むにあたり、調べてみると様々なサイトで似たようなスクリプトが紹介されています。

Windows11 の WSL2 (WSLg) で 日本語入力 [2024/8/12 一部修正]
ChromeOS の Linux コンテナで GUI アプリを実行した場合、ChromeOS 側の日本語入力をそのまま利用することが可能でした。WSL で実行する Linux の場合、GUI アプリには Windows の IME が反応し...
WSLgとFcitx5はWaylandをdisableにして使う - Qiita
問題WSLg使いたい、ext4マウントしたい。とりあえずWindows11にアップグレードした。日本語(個人的には中国語も)入力したい。…日本語入力できないんだが。ということで半日くらい調査して…
https://www.aise.ics.saitama-u.ac.jp/~gotoh/InputMethodOnUbuntu2404.html
ShellScript
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に読み込ませても、同じ状況になり問題は解決しません。

~/.config/systemd/user/fcitx5.service
[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セッションが立ち上がる瞬間まで起動を遅らせるのも無理そうです。

今の所見つけられた解決策としては、シェル起動後に自分で手動で立ち上げる方法です。

ShellScript
# 起動後に
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を経由した場合と違い、パフォーマンスも問題ないレベルで動作するので十分実用性はあるかと思います(手動起動の手間を除けば……)。

現状ではこれ以上の解決策を見つけられそうにないので、また何か発見したら更新します。もしいい解決策があったら教えて頂けると幸いです。

  1. https://dic.pixiv.net/a/%28%EB%88%88_%EB%88%88%29 ↩︎
  2. https://note.com/a01_naut/n/nb2f2b3fc39cb ↩︎

コメント

タイトルとURLをコピーしました