Archive

xmodmap から xremap へ移行

プライベートで使っている ArchLinux 環境のキーバインド変更方法を xmodmap から xremap へ移行した。そのへんをメモしておく。

xremap の選定

k0kubun/xremap: Key remapper for X11 and Wayland

Linux のキーバインド変更方法は色々あり、古くからの定番にあった xmodmap を惰性で長年使っていたのだけど不満が無いこともなかった。主に以下

  • USB機器の抜き差しをすると設定内容がリセットされてしまい、再実行が必要になる
  • アプリケーションによって効いたり効かなかったりがある

特に普段 PC を Typs-C ドックに抜き差しして使っているとちょくちょく設定が飛んでしまうことがありかなり億劫に感じながらも他の方法を探すのをサボり続けて惰性で使い続けていたところがある。

そんななか、以下のブログをみて現状 xremap がかなり完成度が高いんだなと感じ、重い腰を上げて移行してみることにした。

xmodmap から xremap への移行

インストール

ArchLinux の場合、 AUR から簡単にインストールできる。パッケージ名は「xremap-x11-bin」

$ yay -S xremap-x11-bin 

設定(右AltでIME切り替えをできるようにする)

実はキーバインド変更は「右Altを全角/半角に置き換え」しかやってない。そのため、最初は以下の config.yml を用意すれば行けるだろうと思っていたが、どうあがいてもうまく行かなかった

modmap:
  - name: Global
    remap:
      ALT_R: ZenkakuHankaku

fcitx の設定と合わせて色々試した感じ、この設定では右ALTに何もバインドされていないという状況になるっぽい(ただあまり深追いはしていない)

どうしたのもかと xremap の issue を探してみた感じ以下のものを発見

どうもキーバインド変更で「ZenkakuHankaku」になったキーがうまく機能しないような事象ということで、今回自分の環境で起こっていることとおおよそ共通している。ただこの Issue にヒントはあって「KatakanaHiragana」を使えばやりたいこと(右AltでIMEの切り替え)ができるかもしれないと感じ以下のように変更

modmap:
  - name: Global
    remap:
      ALT_R: KatakanaHiragana

「KatakanaHiragana」で切り替えができるように fcitx 側の設定の「Trigger Input Method」に追加

fcitxの設定

ここまでやったところで無事に右AltでIMEの切り替えが安定して動くようになった

xremap の自動起動

ログインするたびに手動でコマンドを実行するの流石に面倒なので systemd で自動起動するようにする。 必要なファイル類を以下のように設置

~/.config/xremap
├── config.yml
└── systemd
    └── xremap.service

config.yml は先程の内容通り。 xremap.service は次の通り

[Unit]
Description=xremap service

[Service]
# restart periodically
Restart=always
ExecStart=/usr/bin/xremap /home/laughk/.config/xremap/config.yml
User=root
Group=root

[Install]
WantedBy=default.target

用意した xremap.service を systemd で有効にする

$ sudo systemctl enable /home/laughk/.config/xremap/systemd/xremap.service
[sudo] password for laughk:
Created symlink /etc/systemd/system/xremap.service → /home/laughk/.config/xremap/systemd/xremap.service.
Created symlink /etc/systemd/system/default.target.wants/xremap.service → /home/laughk/.config/xremap/systemd/xremap.service.

$ sudo systemctl start xremap.service

$ sudo systemctl status xremap.service
[sudo] password for laughk:
● xremap.service - xremap service
     Loaded: loaded (/etc/systemd/system/xremap.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-01-21 21:51:56 JST; 18min ago
   Main PID: 60950 (xremap)
      Tasks: 1 (limit: 57323)
     Memory: 436.0K (peak: 756.0K)
        CPU: 243ms
     CGroup: /system.slice/xremap.service
             └─60950 /usr/bin/xremap /home/laughk/.config/xremap/config.yml

Jan 21 21:51:56 archlinux xremap[60950]: /dev/input/event8 : HDA Intel PCH Mic
Jan 21 21:51:56 archlinux xremap[60950]: /dev/input/event9 : HDA Intel PCH Headphone
Jan 21 21:51:56 archlinux xremap[60950]: ------------------------------------------------------------------------------
Jan 21 21:51:56 archlinux xremap[60950]: Selected keyboards automatically since --device options weren't specified:
Jan 21 21:51:57 archlinux xremap[60950]: ------------------------------------------------------------------------------
Jan 21 21:51:57 archlinux xremap[60950]: /dev/input/event16: Mistel Co.,Ltd. MD600 Alpha
Jan 21 21:51:57 archlinux xremap[60950]: /dev/input/event20: Mistel Co.,Ltd. MD600 Alpha Keyboard
Jan 21 21:51:57 archlinux xremap[60950]: /dev/input/event23: ELECOM TrackBall Mouse DEFT Pro TrackBall
Jan 21 21:51:57 archlinux xremap[60950]: /dev/input/event3 : AT Translated Set 2 keyboard
Jan 21 21:51:57 archlinux xremap[60950]: ------------------------------------------------------------------------------

これで xremap が自動起動されるようになった。 あとは ~/.xprofile から xmodmap 関連の設定を削除すれば完全に xremap へ移行完了。

2024-01-27 追記

xremap を systemd 経由で動かす際、 root 権限でシステムワイドに動かすよりもユーザーサービスとして動かす方が良さそうだったので後日変更した

若干強引だけど、既存の xremap.service を一旦無効化(丁寧にやるなら先に stop してからやったほうがいいのは間違いない)

$ sudo systemctl disable /home/laughk/.config/xremap/systemd/xremap.service
[sudo] password for laughk:
Warning: Can't execute disable on the unit file path. Proceeding with the unit name.
Removed "/etc/systemd/system/xremap.service".
Removed "/etc/systemd/system/default.target.wants/xremap.service".

--user 付きで再度有効化

$ systemctl --user enable /home/laughk/.config/xremap/systemd/xremap.service
Created symlink /home/laughk/.config/systemd/user/xremap.service → /home/laughk/.config/xremap/systemd/xremap.service.
Created symlink /home/laughk/.config/systemd/user/default.target.wants/xremap.service → /home/laughk/.config/xremap/systemd/xremap.service.

手動で起動する場合も --user 付きでやればOK

$ systemctl --user start xremap.service