キーボードリマッパーをXremapに移行した

Waylandでアプリケーション毎にキー配列を変えられるようなリマッパーを探していたのだが、なかなか良いものが見つけられずにいた。

最近ふとしたことで、Xremapを目にすることがあり、READMEをあらためて読んでみた。 このツール自体は昔から知っているのだが、当時はPython製で、Waylandはサポートされていなかったと記憶している。 しかしいまはRustで書かれていて、Waylandにも対応していた。そしてわたしのやりたいことはすべてサポートされているように見えた。すごい進化だ…!

というわけで試してみることにした。

インストール

自分の環境はArch Linuxで、riverを使っている。

riverはwlroots系なので以下をインストール

❯ paru -S xremap-wlroots-bin

設定

ユーザーをinputグループにいれて、udevのルールを追加。

❯ sudo usermod -a -G input $USER
❯ echo 'KERNEL=="uinput", GROUP="input", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/99-input.rules

で、再起動。

リマップ設定

それでこれらのツールで実現したいことの基本的なことは以下の通り:

  • SpaceキーをShiftとして利用。しかし単独で押したときはSpaceとして機能する
    • 特定のアプリケーション(主にゲーム)ではこの機能は無効にしたい
  • キーボードハードウェア毎の配列の調整

Xremapでこれらをみたす設定はこんなかんじになった。

shared:
  games: &games
    - steam_app_default  # DiabloIV
    - steam_app_2694490  # POE2

modmap:
  - name: SandS
    application:
      not: *games
    remap:
      Space:
        held: Shift_L
        alone: Space
        alone_timeout_millis: 999999999

  - name: HHKB
    device:
      only: "Topre Corporation HHKB Professional"
    remap:
      KEY_GRAVE: KEY_ESC
      KEY_ESC: KEY_GRAVE
      KEY_BACKSLASH: KEY_BACKSPACE
      KEY_BACKSPACE: KEY_BACKSLASH

起動はriverの設定から

xremap ~/.config/xremap/config.yaml --watch=config,device &

こんな感じで起動すればokそう。

よくわからなかったところ

  1. alone_timeout_millisの設定
  2. アプリケーションの指定方法
  3. watchコマンドラインオプション
alone_timeout_millisの設定

このタイムアウトを無効にしたかったので、最初は0を指定してみた。そうするとSpace単独でおしてもSpaceとして機能しなくなってしまったw その挙動を望む人はいないとおもうのでよくわからないのだが、とりあえず十分大きい値を設定することにした。

アプリケーションの指定方法

ドキュメントにはswayの例はあるものの、一般的なwlroots系WMで通用するアプリケーションの指定方法の記載がないため、最初はなにを指定したらいいのかわからなかった。 いろいろやってみたところ、どうやら lswt で取得できる app_id を指定すればよいみたいだ。

watchコマンドラインオプション

さいしょ単純に --watch としか指定しなかったら、configの自動リロードなどが動作しないように思えた。 --watch=config などと具体的に指定しないとうごかないっぽい?

まとめ

とまぁ、よくわからない点はあったものの、ひとまず満足。Xremapにはほかにも興味深い機能がいろいろあるので、それらもそのうち見てみたい。