Windows10 の WSL で GUI が使えるようになっていた話

昔 WSL2 が出た当時「Windows11 なら GUI アプリも動かせる」って聞いて Windows11 にしたら試そうと思っていたんだけどいつの間にか Windows10 でも動くようになっていたので Emacs が使えるか試してみました。

公式 Windows バイナリの Emacs でも特に不自由なく使えているんだけどたまに Windows 固有の制約とかがあって微妙に不便なんですよね。

以下は 2024/1 頃の
Windows10 22H2
Ubuntu 22.04.3 LTS (Jammy Jellyfish)
WSL バージョン: 2.0.14.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
GNU Emacs 29.1 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0)

で試しています。

手元の Ubuntu は古かったのでまずは Ubuntu22.04 を新規でインストール。
apt で Emacs を入れようと思ったら apt install じゃなくて snap install しろって書いてる。
snap って何ぞやと思って調べると共有ライブラリも含めてパッケージ化されるんですね。それは新しいライブラリ使いたい時大変だろう?と思ったら大変な事になりました…

良くなかった方法

apt install できるのは 27.1 だったので snap install で 29.1 をインストール。

第一印象:「ちっさ!」  (服が透けて見える魔法を使ったわけではありません)
4Kモニタを150%で使ってるんだけどディスプレイスケールが効いてない?

あと、起動時に

libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast

ってエラーが出てる。2度目の起動では出なかったりよくわかりませんが libstdc++.so.6: version `GLIBCXX_3.4.29' not found らしい。/snap にあるのは 3.4.28 で /usr/lib には 3.4.30 があるようだが… どうすれば良いんだろう、よくわかりません。

そして小さいのはやはりディスプレイスケールが効いて無いようで、この辺り X11 (XWayland) か Wayland かで設定箇所が違う上にそれぞれ複数の方法があって困るのですがとりあえず export GDK_DPI_SCALE=1.5 したらメニューバーのみ拡大された… う~ん。

さらに調べると pure GTK で Emacs をビルドすると Wayland プロトコルを使うので WSL で良い感じらしい?
という事で snap install したものは消してソースからインストールしてみる事にします。

良い方法

Ubuntu 22.04 で Emacs 29.1 をpgtk ビルドでインストール
を参考にソースからインストール。
snap 版と pgtk 版を比べるとこんな感じ。

ここから設定を詰めていきます。

 

ディスプレイスケール

.wslgconfで指定する方法

c:/Users/***/.wslgconf を作って

[system-distro-env]
WESTON_RDP_DISABLE_HI_DPI_SCALING=false
WESTON_RDP_DISABLE_FRACTIONAL_HI_DPI_SCALING=false
WESTON_RDP_DEBUG_DESKTOP_SCALING_FACTOR=150

この方法は snap 版でも効くんだけどフォントがぼやけるのとタイトルバーやツールバーもちょっと変な感じに拡大される。
なんか方法あるのかもしれないけどぼやけるのは致命的…

環境変数で指定する方法

.profile とかに

export GDK_DPI_SCALE=1.5

この方法は snap 版ではメニューバーのみ拡大されて変な感じだけど pgtk 版は良い感じに見える。

後者の方で様子を見てみる事に。

 

IME

Chromebook で Linux アプリを使う場合は Chromebook の IME が自動的に使われるんだけど WSL ではそこまで面倒を見てくれない。
で fcitx-mozc を入れようと思ったら最近は fcitx5 が推奨されているみたい。
Ubuntu 21.10でFcitx 5を使用する

ちなみに fcitx はファイティクスと発音するらしい。読めねーよ! と思って調べると由来とか何の略か選べるとか面白いねw

fcitx

Win11のWSL2 (WSLg)を日本語化 & Mozcで日本語入力 を参考に設定

変換候補ウィンドウが変な位置に出る。

fcitx5

Windows Subsystem for Linuxガイド 第24回 WSLgの日本語入力を設定する を参考に設定

変換ウィンドウはカーソル直下。でもちらつく。そしてたまに消えたまま出なくなる…
ちらつくのは FAQ にもあるので当面は仕様なのかなぁ?

mozc

xim 使わずに Emacs 側で mozc を動かそうと思ったら Wayland だと .Xresources 読まれないので Emacs*useXIM: false とか使えないし configure の --without-xim オプションも効いてないみたい? どうしよう… とりあえず fcitx の設定外してスクショだけ



どれも嫌だなw


Tips

ここまでに紹介したリンク先と被るものもありますが…

最大化/最小化ボタンが無い

gnome-tweaks でボタン表示を on に。
Minimize and Maximize buttons missing from WSL GUI apps

WSLとWindowsでコピペできない

いろいろ方法はあるようですが、追加のキーバインドの要らないこちらの方法で。
WSLg(Wayland) の Emacs(--with-pgtk) でのクリップボード
プロセスが残るのは、全無視は怖いので wl-copy-process 作る時に (set-process-query-on-exit-flag wl-copy-process nil) してみたけど kill-emacs-hook とかでやった方が良いのかも?

 

タスクバーアイコンがペンギンのまま

WSLg(Wayland) の Emacs(--with-pgtk) でのクリップボード

スタートメニュー内のアイコンは/usr/local/share/applications/emacs.desktop の Icons の行を

Icon=/usr/local/share/icons/hicolor/scalable/apps/emacs.svg

とかに変えれば正しく表示される。
WSLg doesn't pick up the actual icons of Linux desktop apps #614

 

Unable to load sb_v_double_arrow from the cursor theme が出る

sudo apt install adwaita-icon-theme-full
WSLg(Wayland) の Emacs(--with-pgtk) でのクリップボード

 

半角/全角が超リピートする

xset -r 49

 

emacsclient は使える?

c:\Windows\system32\wsl.exe emacsclient -n +$(Line):$(Column) $(wslpath $(File))
とか。path の変換は wslpath がやってくれる。
Windows の Unity から WSL の Emacs で開きたいならこんな感じ。


LSP は使える?

Windows 側のソースを WSL の emacs/eglot/omnisharp で解析することはできない。
.csproj は読んでくれるけどそのあと time-out する。ソリューションやプロジェクトファイル内の Windows パスのせいかなぁ?
(もちろん Linux 側のプロジェクトなら問題なく使えます)

追記: 書いてから思いついたけど language server だけ Windows で動かせばいいのかな? できそうな気もするけどちょっと情報が少ないな…  もう少し調べる。  → もう少し調べた。

Windows 側は omnisharp.http-win-x64 を DL して手動で OmniSharp.exe -s <project-dir> -i 192.168.x.x -p 2000 とかで起動すれば http を待ち受けてくれるので WSL 側の eglot で (add-to-list 'eglot-server-programs `(csharp-mode . ("192.168.x.x" 2000))) で通信できるかと思ったら…

貴様、http じゃ無いな!
あと初期化その他で /mnt/x/*** 形式のパスが送られるのでこの変換も必要か。ちょっと現実的じゃないかも。

 

日本語入力が不自由なのと Windows 側のソースを Omnisharp などで扱えないので私の利用目的としては、エディタとして WSL の Emacs を使うのは現時点では無しかなぁ… という感じ。

助けて偉い人!


前の記事 次の記事
No Comment
コメントを追加
comment url