Emacs on WSL2 のための Alacritty 導入メモ

# はじめに

プライベートで利用している WSL2 環境で Windows terminal が頻繁にクラッシュするようになってしまったので、試しに他のターミナルエミュレーターを試そうということで、Alacritty を導入してみた時のメモです。


# 要件

WSL2 上で動作する Emacs (no-window mode) で Org-mode の編集が問題なく行えること


# Alacritty のインストール

Windows 公式のパッケージマネージャーである [winget](https://learn.microsoft.com/ja-jp/windows/package-manager/) で Alacritty をインストールする。 Powershell で以下を実行する

```
winget install Alacritty
```


# Alacritty の設定ファイルパス

<https://github.com/alacritty/alacritty/wiki#windows> にある通り、 `%APPDATA%\alacritty\alacritty.yml` に設定を記述した YAML ファイルを置くと、その設定が読み込まれる。 自分は Windows のシェル周りに詳しくないので `%APPDATA%` がどこを指すのか理解するのに苦労したものの、最終的には powershell で以下のようにすれば確認できる (コマンドプロンプトだと違うらしい)。

```
echo $env:appdata
```


# Alacritty の設定

基本的には以下の記事にある設定を拝借した。

-   **Windowsで至高のターミナル生活を求めて(Alacritty編):** <https://www.asobou.co.jp/blog/web/alacritty>


## WSL を起動するための設定

今回重要なのは `shell:` 以下の設定。これを入れないと Alacritty 起動時に Powershell が起動してしまう。 `-d` 以下は自分が利用しているディストリビューションの名前に変更する。 分からない場合は、Powershell で `wsl -l` を実行するとディストリビューションの一覧がでるのでそれを見てみるとよさそう。


## 見た目とマウスイベントに関する設定

上記の記事にある設定の残りの部分は見た目とマウスイベントに関する設定なのでお好みで。 ただ、以下の 2 点は自分の環境では動作せずコメントアウトした。

-   `font:` の設定は自分の環境に該当のフォントが無いと言われてエラーになった。 おそらく環境にあるフォントを指定すればいいのだと思う。 ただ自分は差し当たりフォントにこだわりはなく、またフォントを調べるのが面倒だったのでコメントアウトした。

-   `background_opacity:` の設定は deprecated だと言われた (今は `window.opacity` らしい)。 これも言われた通りフィールド名を直せばいいと思うのだが、特に透過率にもこだわりがなかったのでコメントアウトしてしまった。


## キーバインドに関する設定

これまでの設定で WSL2 上で Emacs を起動するところまでは問題なくできるようになる。 Emacs でよく利用するいくつかのキーバインドが正しく Emacs に送られない。 具体的には

1.  Alt+何か (M-何か) が全滅
2.  Ctrl+Space (C-SPC) (Markset できない)
3.  Ctrl+/ (C-/) (Undo できない)

が動かず大変由々しき状態である。

このうち、1 と 2 は[この issue のコメント](https://github.com/alacritty/alacritty/issues/93#issuecomment-1364783147) の通りにやるとだいたい解決する。 内容は Alt+何かのキーバインドにすべて ESC+何かのキーのシーケンスを割り当てるという大変漢らしい解決策になっている。 ただこの設定では Alt-Enter と3 の Ctrl+/ が相変わらず正しく動作しないので、以下を追記して対応する。

```yaml
- { key: Return,    mods: Alt,       chars: "\x1b\r"                      } # ESC+CR
- { key: Slash,     mods: Control,   chars: "\x1f"                        } # US
```

`\x1b` が ASCII の `ESC` になり、 `\r` が Enter (CR) に相当する。 また、 `\x1f` は ASCII の `US` で、これは Ctrl+\_ に相当する (Emacs では Ctrl+\_ でも undo する)。


# おわりに

ターミナルエミュレーターを Alacritty に変えてから今のところクラッシュせず動作している。 結果、Alacritty を上記の通り導入することで快適な Emacs ライフを取り戻すことができた。 (ところで、なぜうちの Windows Terminal はああもクラッシュするのだろうか&#x2026; 🤔 Event viewer とか見たけど原因わからず&#x2026;)

# Appendix
Alacritty の設定ファイルのうち、今回導入時に追記したもの (紹介した記事と重複するところは省いてます)。

```yaml
shell:
  program: /Windows/System32/wsl.exe ~ -d Ubuntu

key_bindings:
  - { key: A,         mods: Alt,       chars: "\x1ba"                       }
  - { key: B,         mods: Alt,       chars: "\x1bb"                       }
  - { key: C,         mods: Alt,       chars: "\x1bc"                       }
  - { key: D,         mods: Alt,       chars: "\x1bd"                       }
  - { key: E,         mods: Alt,       chars: "\x1be"                       }
  - { key: F,         mods: Alt,       chars: "\x1bf"                       }
  - { key: G,         mods: Alt,       chars: "\x1bg"                       }
  - { key: H,         mods: Alt,       chars: "\x1bh"                       }
  - { key: I,         mods: Alt,       chars: "\x1bi"                       }
  - { key: J,         mods: Alt,       chars: "\x1bj"                       }
  - { key: K,         mods: Alt,       chars: "\x1bk"                       }
  - { key: L,         mods: Alt,       chars: "\x1bl"                       }
  - { key: M,         mods: Alt,       chars: "\x1bm"                       }
  - { key: N,         mods: Alt,       chars: "\x1bn"                       }
  - { key: O,         mods: Alt,       chars: "\x1bo"                       }
  - { key: P,         mods: Alt,       chars: "\x1bp"                       }
  - { key: Q,         mods: Alt,       chars: "\x1bq"                       }
  - { key: R,         mods: Alt,       chars: "\x1br"                       }
  - { key: S,         mods: Alt,       chars: "\x1bs"                       }
  - { key: T,         mods: Alt,       chars: "\x1bt"                       }
  - { key: U,         mods: Alt,       chars: "\x1bu"                       }
  - { key: V,         mods: Alt,       chars: "\x1bv"                       }
  - { key: W,         mods: Alt,       chars: "\x1bw"                       }
  - { key: X,         mods: Alt,       chars: "\x1bx"                       }
  - { key: Y,         mods: Alt,       chars: "\x1by"                       }
  - { key: Z,         mods: Alt,       chars: "\x1bz"                       }
  - { key: A,         mods: Alt|Shift, chars: "\x1bA"                       }
  - { key: B,         mods: Alt|Shift, chars: "\x1bB"                       }
  - { key: C,         mods: Alt|Shift, chars: "\x1bC"                       }
  - { key: D,         mods: Alt|Shift, chars: "\x1bD"                       }
  - { key: E,         mods: Alt|Shift, chars: "\x1bE"                       }
  - { key: F,         mods: Alt|Shift, chars: "\x1bF"                       }
  - { key: G,         mods: Alt|Shift, chars: "\x1bG"                       }
  - { key: H,         mods: Alt|Shift, chars: "\x1bH"                       }
  - { key: I,         mods: Alt|Shift, chars: "\x1bI"                       }
  - { key: J,         mods: Alt|Shift, chars: "\x1bJ"                       }
  - { key: K,         mods: Alt|Shift, chars: "\x1bK"                       }
  - { key: L,         mods: Alt|Shift, chars: "\x1bL"                       }
  - { key: M,         mods: Alt|Shift, chars: "\x1bM"                       }
  - { key: N,         mods: Alt|Shift, chars: "\x1bN"                       }
  - { key: O,         mods: Alt|Shift, chars: "\x1bO"                       }
  - { key: P,         mods: Alt|Shift, chars: "\x1bP"                       }
  - { key: Q,         mods: Alt|Shift, chars: "\x1bQ"                       }
  - { key: R,         mods: Alt|Shift, chars: "\x1bR"                       }
  - { key: S,         mods: Alt|Shift, chars: "\x1bS"                       }
  - { key: T,         mods: Alt|Shift, chars: "\x1bT"                       }
  - { key: U,         mods: Alt|Shift, chars: "\x1bU"                       }
  - { key: V,         mods: Alt|Shift, chars: "\x1bV"                       }
  - { key: W,         mods: Alt|Shift, chars: "\x1bW"                       }
  - { key: X,         mods: Alt|Shift, chars: "\x1bX"                       }
  - { key: Y,         mods: Alt|Shift, chars: "\x1bY"                       }
  - { key: Z,         mods: Alt|Shift, chars: "\x1bZ"                       }
  - { key: Key1,      mods: Alt,       chars: "\x1b1"                       }
  - { key: Key2,      mods: Alt,       chars: "\x1b2"                       }
  - { key: Key3,      mods: Alt,       chars: "\x1b3"                       }
  - { key: Key4,      mods: Alt,       chars: "\x1b4"                       }
  - { key: Key5,      mods: Alt,       chars: "\x1b5"                       }
  - { key: Key6,      mods: Alt,       chars: "\x1b6"                       }
  - { key: Key7,      mods: Alt,       chars: "\x1b7"                       }
  - { key: Key8,      mods: Alt,       chars: "\x1b8"                       }
  - { key: Key9,      mods: Alt,       chars: "\x1b9"                       }
  - { key: Key0,      mods: Alt,       chars: "\x1b0"                       }
  - { key: Space,     mods: Control,   chars: "\x00"                        } # Ctrl + Space
  - { key: Grave,     mods: Alt,       chars: "\x1b`"                       } # Alt + `
  - { key: Grave,     mods: Alt|Shift, chars: "\x1b~"                       } # Alt + ~
  - { key: Period,    mods: Alt,       chars: "\x1b."                       } # Alt + .
  - { key: Key8,      mods: Alt|Shift, chars: "\x1b*"                       } # Alt + *
  - { key: Key3,      mods: Alt|Shift, chars: "\x1b#"                       } # Alt + #
  - { key: Period,    mods: Alt|Shift, chars: "\x1b>"                       } # Alt + >
  - { key: Comma,     mods: Alt|Shift, chars: "\x1b<"                       } # Alt + <
  - { key: Minus,     mods: Alt|Shift, chars: "\x1b_"                       } # Alt + _
  - { key: Key5,      mods: Alt|Shift, chars: "\x1b%"                       } # Alt + %
  - { key: Key6,      mods: Alt|Shift, chars: "\x1b^"                       } # Alt + ^
  - { key: Backslash, mods: Alt,       chars: "\x1b\\"                      } # Alt + \
  - { key: Backslash, mods: Alt|Shift, chars: "\x1b|"                       } # Alt + |```
  - { key: Return,    mods: Alt,       chars: "\x1b\r"                      }
  - { key: Slash,     mods: Control,   chars: "\x1f"                        }
```