Ubuntu(Wayland) 環境で Alacritty で日本語を入力できるようにする方法

[Alacritty](https://github.com/alacritty/alacritty) は [Rust](https://www.rust-lang.org/ja) で書かれたターミナルエミュレーターです。

Rust で書かれているので、高速かつ安全なことが大きな特徴のターミナルエミュレーターと言えると思いますが、現時点では日本語サポートが微妙だったりといろいろと問題があります。
特に、Wayland 環境で使用した際には全く日本語の入力ができなくなってしまう問題が知られています。この問題を回避して快適に Alacritty を使う方法をこの記事では紹介したいと思います。

# TL;DR
* 環境変数に `WINIT_UNIX_BACKEND=x11` を指定し、バックエンドを X11 に変更して使用する。
* `/usr/share/applications/com.alacritty.Alacritty.desktop` にあるファイルを `~/.local/share/applications/com.alacritty.Alacritty.desktop` にコピーして、`Exec` 部分を `Exec=env WINIT_UNIX_BACKEND=x11 alacritty` と書き換える。
* 既存の「キーボードショートカット」の設定を別のキーバインドに変更し、Ctrl+Alt+T で実行するコマンドを `env WINIT_UNIX_BACKEND=x11 /usr/bin/alacritty` などに変更する。

# なぜ Wayland では日本語入力ができなくなるのか
結論から言うと Alacritty が対応していないからということになります。

X11 の場合は alacritty のウィンドウ周りを司る winit が XIM (X Input Method) に対応しているため問題なく日本語入力が動作しますが、Wayland だとここらへんの仕組みがまだ整っていないことが原因の模様です[^1]。
ということで、winit に X11 バックエンドを使ってもらうことによって日本語入力ができないという問題は解決できます。
その方法が環境変数に `WINIT_UNIX_BACKEND=x11` を指定するということになります[^2]。

winit でも IME をちゃんと扱えるようにということで、Tracking Issue が作成され始めたようですが[^3]、まだ基盤レベルでも全然対応されていないというのが実情なので、しばらくはこの状況が続きそうです。 

# ショートカットから起動される Alacritty でも日本語入力できるようにする
さて、とりあえず `WINIT_UNIX_BACKEND=x11` を指定することで日本語入力ができるようになることは分かりました。
しかしこのままだと、Alacritty を起動するたびにターミナルで `WINIT_UNIX_BACKEND=x11 alacritty` みたいな方法で起動しなければならない状況です。
アクティビティのショートカットから起動する際にも `WINIT_UNIX_BACKEND=x11` が勝手に付与されてほしいので、これを実現する方法を次に紹介します。

まず、前提としてアクティビティのショートカットは `/usr/share/applications/` に配置されたファイルによって制御されています[^4]。
Alacritty をレポジトリからインストールしている場合は `/usr/share/applications/com.alacritty.Alacritty.desktop` にファイルが配置されているはずです。
これをそのまま編集しても良いのですが、そうすると Alacritty を更新するたびに書き換える羽目に陥ります。
これを避けるために、個人用の `~/.local/share/applications/` ディレクトリにファイルの中身をコピーして書き換えるという形で対応することにします。

`/usr/share/applications/com.alacritty.Alacritty.desktop` の `Exec` 部分が実際に alacritty を起動するためのコマンドになっているので、この部分を `Exec=env WINIT_UNIX_BACKEND=x11 alacritty` のように、環境変数を指定して起動するようにすれば、アクティビティのショートカットから起動する場合も日本語入力ができるようになります。

つまり、以下のようなファイルを `~/.local/share/applications/com.alacritty.Alacritty.desktop` に作成すれば良いです。

```ini
[Desktop Entry]
Type=Application
TryExec=alacritty
Exec=env WINIT_UNIX_BACKEND=x11 alacritty
Icon=com.alacritty.Alacritty
Terminal=false
Categories=System;TerminalEmulator;

Name=Alacritty
GenericName=Terminal
Comment=A cross-platform, GPU enhanced terminal emulator
StartupWMClass=Alacritty
Actions=New;

[Desktop Action New]
Name=New Terminal
Exec=alacritty
```

将来の Alacritty のバージョンでは若干異なるファイル内容になるかもしれません。
基本的には Copy してから書き換えることを推奨します。

# Ctrl+Alt+T で起動するターミナルも日本語入力できるようにする
これで問題ないかと思ったのですが、Ctrl+Alt+T で起動されるターミナルにはどうやら上記ショートカットの設定は関係していないようです。
これでは Ctrl+Alt+T で起動したターミナルのみ日本語入力ができない気持ち悪い状況になってしまいます。

いろいろと調べてみたのですが、一番手っ取り早い方法としては自前のショートカットに置き換えてしまうのが良さそうです。

「設定」アプリを開き、「デバイス」→「キーボードショートカット」としてキーボードショートカットを設定する画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63615/ae294eca-f695-d68b-af3f-246373b6615d.png)

ここで、「端末の起動」のショートカットをデフォルトとは異なるものに書き換えておきます。不要ならば無効にしても良いかと思います。
そして下の方にある、+ ボタンから新しいショートカットを作成しましょう。内容としては以下の画像のような感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63615/399e24c1-e473-532a-8e38-39f331f45871.png)

これで、Ctrl+Alt+T で起動するターミナルでも日本語入力ができるようになりました。

# 結論
ということで TL;DR にも記載しましたが、以下の手順で Alacritty で問題なく日本語入力を行うことができるようになります。
Alacritty は日本語入力できないから、Gnome 端末を使っていた人はこの際に是非チャレンジしてほしいと思います。

* 環境変数に `WINIT_UNIX_BACKEND=x11` を指定し、バックエンドを X11 に変更して使用する。
* `/usr/share/applications/com.alacritty.Alacritty.desktop` にあるファイルを `~/.local/share/applications/com.alacritty.Alacritty.desktop` にコピーして、`Exec` 部分を `Exec=env WINIT_UNIX_BACKEND=x11 alacritty` と書き換える。
* 既存の「キーボードショートカット」の設定を別のキーバインドに変更し、Ctrl+Alt+T で実行するコマンドを `env WINIT_UNIX_BACKEND=x11 /usr/bin/alacritty` などに変更する。

# おまけ
私の使用している [alacritty.xml](https://github.com/StoneDot/dotfiles/blob/master/alacritty.xml) を晒しておきます。
基本デフォルトのままですが、どのような変更がされているか気になる方は History を見てみると良いかと思います。

[^1]: [Linux input method support](https://github.com/alacritty/alacritty/issues/44)
[^2]: [Cannot input japanese characters](https://github.com/alacritty/alacritty/issues/1101)
[^3]: [Tracking issue for CompositionEvent support](https://github.com/rust-windowing/winit/issues/1497)
[^4]: [Desktop files: putting your application in the desktop menus](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en)