仕事で利用したりしている Slack などのキーボードでの操作が面倒になってきたので、 emacs keybind が利用できるようにするため xremap を利用することにした。

この記事はその利用するまでの顛末をメモとして残す。

導入

これは、さくっと cargo install xremap でインストールできます。 rust をまだ導入していない方は 公式ページのインストール を参考にインストールしてください。

起動!!!

これも簡単で以下のコマンドで起動します。

xremap /path/to/your/xremap/config.yml

エラーに遭遇

起動してみると以下のようなメッセージが出て起動ができませんでした。

Selecting devices from the following list:
------------------------------------------------------------------------------
/dev/input/event0 : Power Button
/dev/input/event1 : Power Button
/dev/input/event2 : HDA NVidia HDMI/DP,pcm=3
/dev/input/event3 : HDA NVidia HDMI/DP,pcm=7
/dev/input/event4 : HDA NVidia HDMI/DP,pcm=8
/dev/input/event5 : HDA NVidia HDMI/DP,pcm=9
/dev/input/event6 : HDA NVidia HDMI/DP,pcm=10
/dev/input/event7 : HDA NVidia HDMI/DP,pcm=11
/dev/input/event8 : Pekaso The Fortitude60 Keyboard
/dev/input/event9 : Pekaso The Fortitude60 Keyboard Mouse
/dev/input/event10: Pekaso The Fortitude60 Keyboard System Control
/dev/input/event11: Pekaso The Fortitude60 Keyboard Consumer Control
/dev/input/event12: Kensington Kensington Slimblade Trackball
/dev/input/event13: Burr-Brown from TI               USB Audio CODEC
/dev/input/event14: HD Web Camera: HD Web Camera
------------------------------------------------------------------------------
Selected keyboards automatically since --device options weren't specified:
------------------------------------------------------------------------------
/dev/input/event8 : Pekaso The Fortitude60 Keyboard
------------------------------------------------------------------------------
Error: Failed to build an output device: no such file or directory (os error 2)

で、答えは出てるので設定ファイル、対象となる入力デバイスなどを見ますが、 これらのファイルはあるのでわからんとなります。

しかたないのでソースをダウンロードして手元でデバッグしてみます。 rust というか cargo は便利で、cargo run でソースをいじったあとすぐにコンパイルして利用することができます。 今回はメンドウなので怪しいところに println 文を挿入して実行してみます。 そうすると、どうやら src/output.rs の 39 行目の VirtualDeviceBuilder に問題がありそう ということがわかりました。

この行のどこに問題あるんだ?と思い利用しているこのライブラリ evdev を見ることにしました1。 そうすると /dev/uinput が必要 ということがわかります。 それで /dev/uinput があるかどうか ls で見ますが、当然無いので無いです。 なぜ無いのかというと INPUT_UINPUT でドライバーを入れていなかったようです。 なのでカーネルのビルトインとしてビルドして再起動。

Defined at drivers/input/misc/Kconfig:513
     Prompt: User level driver support
     Depends on: INPUT [=y] && INPUT_MISC [=y]
     Location:
       -> Device Drivers
         -> Input device support
           -> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
             -> Miscellaneous devices (INPUT_MISC [=y])
               -> User level driver support

再起動したら、確認を行ないます。

$ xremap ~/.config/xremap/config.yml
Selecting devices from the following list:
------------------------------------------------------------------------------
/dev/input/event0 : Power Button
/dev/input/event1 : Power Button
/dev/input/event2 : HDA NVidia HDMI/DP,pcm=3
/dev/input/event3 : HDA NVidia HDMI/DP,pcm=7
/dev/input/event4 : HDA NVidia HDMI/DP,pcm=8
/dev/input/event5 : HDA NVidia HDMI/DP,pcm=9
/dev/input/event6 : HDA NVidia HDMI/DP,pcm=10
/dev/input/event7 : HDA NVidia HDMI/DP,pcm=11
/dev/input/event8 : Pekaso The Fortitude60 Keyboard
/dev/input/event9 : Pekaso The Fortitude60 Keyboard Mouse
/dev/input/event10: Pekaso The Fortitude60 Keyboard System Control
/dev/input/event11: Pekaso The Fortitude60 Keyboard Consumer Control
/dev/input/event12: Kensington Kensington Slimblade Trackball
/dev/input/event13: Burr-Brown from TI               USB Audio CODEC
/dev/input/event14: HD Web Camera: HD Web Camera
------------------------------------------------------------------------------
Selected keyboards automatically since --device options weren't specified:
------------------------------------------------------------------------------
/dev/input/event8 : Pekaso The Fortitude60 Keyboard
------------------------------------------------------------------------------

yatta 起動できた! あとは、アプリでキーバインドが効いているかどうかを確認して、 Window Manager である i3 の起動時に xremap が起動するようにしたりしています。

おわり

最近、 Mac との行き来をしていると emacs keybind が使えないときにちょっといらっとしますので使えるようにキーバインドを変更してみました。 設定ファイルの動的読み込みに対応していないのがちょっと面倒なのですが2、これで Slack などで C-a で行頭にもどれるようになりました。便利。


  1. はじめは似た名前のライブラリの evdev-rs を見てたのですが、対象であるはずのファイル内に宣言されていないのでちょっととまどい、このライブラリは違うやつだとなり crates.io で再検索して発見しています。 

  2. どうせ1回確認できたら再起動する必要はないので問題ないといえば問題ないけど、ちょっと面倒。