【Ubuntu 22.04 LTS】xremapでMozcのCapsLockキーと全角・半角のキーマッピングを行う

一年前に中古で購入したwin11のゲーミングPCが常時ディスク使用率100％状態で、色々設定をいじっても治らず、SSDの交換も金がかかるし、基盤をぶっ壊したら悲惨なことになるので、思いっきってOSをwinから動作の軽いubuntuに変えた結果、ディスク使用率の問題は解決したが、キーボードの日本語・英語の切り替えキー云々で3日ぐらい手こずったので、備忘録も兼ねて記事を書いていく。

# 目的

winを使うとき、いつもCapsLockでIMEの無効化・有効化（英語・ひらがな入力の切り替え）をしていて、それが手に馴染んでいるため、ubuntuでも同様に、CapsLockで切り替えができるようにする。

# 試してうまく行かなかったこと

1. Mozcの設定上で、CapsLockの動きを全角・半角キーと同じ動きにする
→ 設定がなぜか反映されずに失敗
2. xmodmapでCapsLockと全角・半角キーを交換する
→ うまく反映されたが、特定のウィンドウははぜか適応されない
3. 同様にXKBでCapsLockと全角・半角キーを交換する
→ 設定コンフィグがエラーになり、うまく行かずに断念

色々調べたら、Ubuntu 22.04ではxkbはWaylandでは動かないのでxremap使ったほうがいいという記事があったので、それを使ってキーバインドをして行きます。なんでUbuntu 22.04ではxkbはWaylandでは動かないとか、Waylandとはなんなのかとはについては、私はインフラエンジニアじゃないし、興味がないので、そういうものだと思っておきます、目的はCapsLockで日本語・英語の切り替えをできるようにすることなので、その過程の知識は必要ないです。

https://github.com/xremap/xremap

# 手順

1. Cargoのインストール
2. xremapのインストール
3. キーマッピング設定ファイルの作成
4. xremapで設定ファイルを読み込み

# Cargoのインストール

xremapはCragoでインストールする必要があるので、Cragoをインストールする。

```bash
sudo apt install cargo
```

インストールできるてるか確認。

```bash
sudo cargo -V
```

`cargo 1.75.0` などのバージョンナンバーを表示されればインストール完了。

# xremapのインストール

https://github.com/xremap/xremap

公式ドキュメントからインストールコマンドを参照し、以下のコマンドでインストールする

```bash
#xremapでコンフィグファイルを読み込む際、sudoコマンドで実行する必要があるため、sudoでインストールを行う
sudo cargo install xremap 
```

同様にインストールできてるか確認する、なお、環境変数の設定はめんどくさいので、ディレクトリの記載が必要。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191791/731b4cf4-b6e7-8747-ef36-36d1a9676695.png)

この場合、/root/.cargo/binのディレクトリにインストールされているので、下記のコマンドで確認。

```bash
sudo /root/.cargo/bin/xremap -V
```

`xremap 0.8.18` などのバージョンナンバーを表示されればインストール完了

# キーマッピング設定ファイルの作成

最難関です、というのも公式ドキュメントを見ても、全角・半角キーのキーシンボル（コンフィグファイルで記載するキーの名前）の記載例がないのでかなり困りました。

[Ubuntu 22.04 + Wayland Xremapで変換キーとの組み合わせをリマップ](https://symfoware.blog.fc2.com/blog-entry-2677.html)

上記記事によりますと、xevで確認したキーコードに8を引いた値を、https://github.com/emberian/evdev/blob/1d020f11b283b0648427a2844b6b980f1a268221/src/scancodes.rs#L26-L572 のコードで探すとそのキーシンボルがわかるとのこと。~~8引くとかなんでやねん~~

今回交換する、CapsLockと全角・半角キーのキーコードを`xev`コマンドで調べる。

```bash
xev
```
![それぞれ2回表示されるのは、おそらくキーを押して、離してで2回判定があるものかと思われる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191791/37bb7cb5-b324-2fa2-9e23-07e71971544c.png)
それぞれ2回表示されるのは、おそらくキーを押して、離してで2回判定があるものかと思われる。

CapsLockのキーコードは66、全角半角は49なので、それぞれに8引いて、58と41だね。~~8引くとかなんでやねん（二回目）~~

https://github.com/emberian/evdev/blob/1d020f11b283b0648427a2844b6b980f1a268221/src/scancodes.rs#L26-L572 を見ると、それぞれのキーシンボルは、`KEY_CAPSLOCK`と`KEY_GRAVE` で`KEY_` は省略可能なので、`CAPSLOCK`と`GRAVE` はキーシンボルになる。

それらを踏まえて、以下のファイルを作成、ファイル名は`xremap.yml` とし、ホームディレクトリに保存。

```rust
keymap:
  - name: Swap CapsLock and Zenkaku_Hankaku
    remap:
      CapsLock: Grave
      Grave: CapsLock
```

# xremapで設定ファイルを読み込み

下記コマンドをホームディレクトリで実行する。

```bash
sudo /root/.cargo/bin/xremap xremap.yml
```

あとは自動で、xremapが自動的に接続機器を読み込んで、実行状態となる、下の画像が表示されれば設定が適応された状態となる。

![Untitled2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191791/cd6c8ca0-4bb3-90a9-eac6-07ddda369f58.png)


なお、この状態では、ターミナルを閉じると、プロセスが中断されるため、`nohup` で実行する。

```bash
nohup sudo /root/.cargo/bin/xremap xremap.yml
```

ゲームなどをする際は、めんどくさいが`pgrep` コマンドでプロセスIDを特定し、`sudo kill`でプロセスを終了する

![Untitled3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191791/cebb68e3-f531-e975-2cd3-919c3b5913f7.png)

いちいちコマンド打つのがめんどくさいなら、GUIアプリケーションを作成しよう！気が向いたら、そのうちGUIアプリケーションを作成して、配布するかもしれません。

# 最後に

軽い気持ちでubuntuを使ったが、winと比べていろんなことを自分でやらないと行けないっていう大変さを知って、winとmacの素晴らしさを再認識した、まぁ、有料だから当たり前っちゃ当たり前かもしれないが、、

それでもwinはバージョンを重ねるごとに、要求リソースが高くなるため、古いPCを使うのであれば、ubuntuがよいのかもしれません。