X Windowを設定してWSL2のEmacsを快適に使う

Windows 11のWSL2にインストールしたUbuntu上で、Emacsを快適に使うためにX Windowを設定しました。RedHat(CentOS)系のAlmaLinuxやRocky Linuxなどでも同様の手順になります。

X Windowの設定

VcXsrv Windows X ServerのDownloadをクリックしてから、ダウンロードファイルを使ってインストールを行います。デスクトップに「XLaunch」というショートカット(実態はC:\Program Files\VcXsrv\xlaunch.exe)が作成されるので、これを起動します。メニューに従い、以下の項目を選択しながら「次へ」をクリックして行きます。

  • Multiple windows
  • Start no client

「Extra settings」画面になったら、下部にある「Additional parameters for VcXsrv」に「-ac」と入力します。

「-ac」を入力

「Finish configuratoin」画面になりますので、「Save configuration」ボタンをクリックして、「config.xlaunch」を保存してから完了ボタンをクリックします。

「Save configuratoin」で設定ファイルを保存

次に、Windowsマークの右クリックから「ファイル名を指定して実行」画面を開き、「shell:startup」と入力します。

スタートアップを開く

先ほど保存した「config.xlaunch」ファイルのショットカットをスタートアップに置きます。これで、Windows起動時にX Windowを自動的に設定することができます。

VcXsrvの設定ファイルのショートカット

Emacsの設定

WSL2のUbuntuにEmacsをインストールします。

$ sudo apt install emacs

RedHat(CentOS)系なら次のコマンドになります。AlmaLinuxやRocky Linuxなどにインストールするときに使います。

$ sudo dnf install emacs

Emacsの設定ファイルを「~/.emacs.d/init.el」に作成します。サンプルを以下に示します。

;; テーマ
(load-theme 'misterioso' t)

;; スタートアップメッセージを表示させない
(setq inhibit-startup-message t)

;; 列数を表示する
(setq column-number-mode t)

;; タブを4文字に設定
(setq default-tab-width 4)

;;ウィンドウを左右に分割したとき用の設定
(setq-default truncate-partial-width-windows t)

;; メニューバーを非表示
;(menu-bar-mode 0)

;; ツールバーを非表示
(tool-bar-mode 0)

;; ファイルのフルパスをタイトルバーに表示
(setq frame-title-format
      (format "%%f - Emacs@%s" (system-name)))

;; サイズ
(set-frame-size (selected-frame) 130 50)

;; カーソル
(set-cursor-color "#ffffff")

これで、ターミナルから「emacs」と入力することで、Emacsを別ウインドウで開くことができました。

export DISPLAYによる表示画面の設定

もし上手く行かないようでしたら、ホームディレクトリの.bashrcに以下を追加して有効にして下さい。

export DISPLAY=$(cat /etc/resolv.conf | grep -m1 nameserver | awk '{print $2}'):0.0

上記でもDISPLAYの設定が機能しないようでしたら、代わりに、以下の行を.bashrcに追加して有効にして下さい。

export DISPLAY=$(ifconfig | grep -m1 inet | awk '{print $2}'):0.0

なお、ifconfigコマンドがインストールされていない場合は、次の処理をターミナルで実行してインストールします。

$ sudo apt install net-tools

それでも動かないという方は、祈りながら下記を.bashrcに追加してから、「source .bashrc」しましょう。

export DISPLAY=$(/mnt/c/WINDOWS/system32/route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0

この設定でエラーが大量に出た場合は、以下の設定が有効かも知れません(”runtime-emacs”部分は任意文字列)。

export XDG_RUNTIME_DIR=/tmp/runtime-emacs
export LIBGL_ALWAYS_SOFTWARE=1