keyd is awesome

太古の昔はコンピュータに繋がってるキーボードはひとつだけで、しかも静的に接続されていたが今はそうではなく複数の、しかも異なるレイアウトのキーボードを動的に繋げたり外したりすることができる…のだが、ソフトウェア側でそれに対応しているのかはよく分からない。OSのキーボードの設定とかで接続されているキーボードごとに割り当てるレイアウトを決められるとかそういうものは見たことがない。

さて調べてみたところkeydというものがあり、ちょっと試している。上述の問題はデバイスIDを明示することで少し解決できる。それ以外にも非常に自由度の高いリマップを行える。

ちなみにちょっとしたリマップの機能はgnome自身も持っている(正確には、リアルタイムでsetxkbmapに対する定義を行うような機構だと思う)のでkeydをメインで使う場合はgnomeのそれは触らない方がよいかもしれない。すなわち、org.gnome.desktop.input-sourcesxkb-optionsを単に空([])にする。

$ gsettings set org.gnome.desktop.input-sources xkb-options “[]”

もしこれに何か定義されている場合、例えば['ctrl:swapcaps', 'ctrl:ctrl_ralt', 'compose:menu']と言った値が入っている。そのまんま、setxkbmapのオプションに与えるアレの配列である。なおアレのリストはsetxkbmap -print -v 10で出力されるrulesファイルの中に書いてある。たとえば/usr/share/X11/xkb/rules/evdevとかだ。

インストール

いろいろ調べるとkeydのインストールはgithubからcloneしてmakeみたいなことを指示している文書が多いが、masterブランチは開発中のものなのでcloneするのはstableとタグが付けられたコミットの方がいい(とreadmeに書いてある)。その他いくつかのディストロについては一応パッケージが用意されている。以下ubuntuの場合。ubuntuでは現在ppaを経由することになっているが、とても便利なツールなのでそのうち標準のリポジトリに入る気がする。

$ sudo apt-add-repository ppa:keyd-team/ppa $ sudo apt update $ sudo apt install keyd

これでインストールされる実行形式は、そのままだとあまりにジェネリックすぎるためか、keyd.rvaiyaという名前になっていた。man の項目も同様にman 1 keyd.rvaiya

インストール後はsystemdのシステムサービスが登録されているのでそれを有効にすると起動時から有効になる。

$ sudo systemctl enable keyd --now

トラブルシューティング

さて設定をどこにどう書くかとか何ができるかは上記の通りmanを見れば全部記述してあるのでここには書かないのだがハマりポイントをいくつか覚え書きしておきたい。

  • 冒頭に書いたとおりgnomeでxkb-optionsを設定しているとかち合う恐れがあるので、それは空にしておいた方がよい。もしかしたら/etc/default/keyboard内に書くXKBOPTIONSも空でよいかもしれない。
  • 今使ってるマシンにはThinkPad USB Keyboard with TrackPointという赤いぽっち付きのキーボードを繋げているのだがこのキーボード、キーボード部分とポインティングデバイス部分のデバイスIDが同じであるためにちょっとした混乱が起きるので一工夫が必要(後述)。

デバイスIDを共有するデバイスの取り扱い

keydは試験的にポインティングデバイスも取り扱うようになっているが(これはボタンが10個とか100個とか付いてるマウスもkeydの作法でリマップできたら便利かもという発想であろう)、そうするとポインティングデバイスとしての固有の動作が無効になってしまい、件のキーボードの場合例えばポインタのアクセラレーションや中ボタン+トラックポイントによるスクロール操作が全部パーになってしまうのであった。

keydはデバイスIDを共有する複数のデバイスに対してはちょっとしたチェックサムを生成して区別できるようになっているので(keyd.rvaiya monitorとすることで確認できる)設定ファイルで該当するデバイスを除外する:

$ sudo keyd.rvaiya monitor device added: 17ef:6009:eee4ba01 Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint (/dev/input/event2) device added: 17ef:6009:ab84dcc1 Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint (/dev/input/event3) Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint 17ef:6009:eee4ba01 m up Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint 17ef:6009:eee4ba01 capslock up Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint 17ef:6009:eee4ba01 capslock down Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint 17ef:6009:eee4ba01 c down

この例だとキー押下イベントを発生させているのはeee4ba01の方でab84dcc1がポインティングデバイスだと判断できるので、/etc/keyd/default.confの冒頭を

[ids] * -17ef:6009:ab84dcc1

などとして該当するデバイスIDを除外すればよい。

というわけでkeydを通してcapslockをctrlに、右altをctrlにした。長々と書いた割にリマップ内容は極ふつーというオチ。