Rkremap
Linux でキー割り当てを変更するプログラムを作るためのライブラリ。
Installation
% gem install rkremap
Usage
ライブラリなのでプログラムを自分で作る必要がある。具体的な使い方は example/*.rb を見ればよい。
/dev/input/event* と /dev/uinput に対する権限が必要。sudo 等で root 権限で動かすのが良いかも。
ユーザーを input グループに所属させると /dev/input/event* を読み取る権限をつけられるけど、そのユーザーはすべての入力デバイスの入力を読み取ることができるようになってしまうので、セキュリティ的にはビミョーなところ。
input グループでも /dev/uinput に権限はないけど、/etc/udev/rules.d/input.rules ファイルを
KERNEL=="uinput", GROUP="input"
という内容で作れば /dev/uinput のグループを input にできるっぽい。
$VERBOSE が真の場合はデバイスを検出したときと切断を検出したときにデバイス名を標準出力に出力する。
Rkremap
Rkremap.new
引数を指定しなければ自動的にキーボードデバイスの検出を試みる。
引数を指定する場合は /dev/input/event* を指定する。キーボードデバイス以外を指定してもたぶん無意味。
キーボードのデバイスファイル名を調べるには
cat /proc/bus/input/devices
とかすればわかるかもしれない。または
sudo evtest /dev/input/eventX
とかして何かキーを押して出力があればそれ。
ThinkPad 本体のキーボードは /dev/input/event3 だった。
Rkremap#exclude
無視するデバイス名を正規表現で指定できる。
例
rkremap.exclude = /touchpad/i
Rkremap#mouse
真を指定するとマウスも対象にする。
Rkremap#grab
true を設定するとキーイベントを奪う。キーイベントを見るだけでいいなら false を設定する。
:keyboard を設定するとキーボードデバイスを grab する。
:mouse を設定するとマウスデバイスを grab する。
正規表現を設定するとデバイス名がマッチした場合にデバイスを grab する。
Rkremap#window_system
"x11" に設定すると X のアプリ名等を取得できる。Wayland 環境では動かない。
"kde", "kwin" に設定すると KDE/Kubuntu 環境でアプリメオ等を取得できる。Wayland 環境でも動作する。
Rkremap#modifers
修飾キーの一覧。これらのキーは単体で押されただけでは start ブロックを実行しない。
Rkremap#auto_detect
true の場合はキーボードデバイスの接続を自動検知する。
new 時にデバイスファイルが指定されない場合は true になる。
Rkremap#remap
引数の Hash で変換するキーを指定する:
rk.remap(KEY_CAPSLOCK => KEY_LEFTCTRL)
変換元を配列で修飾キーを書くとその修飾キーとの組み合わせで変換する:
rk.remap([KEY_LEFTCTRL, KEY_A] => KEY_HOME)
hold を指定すると指定秒数長押ししたときだけ変換する:
rk.remap(hold: 0.5, map: {
KEY_MUHENKAN => KEY_RIGHTMETA,
KEY_HENKAN => KEY_RIGHTMETA,
})
次のように書くと、A も B も C もすべて A になってしまう:
rk.remap(KEY_A => KEY_B)
rk.remap(KEY_B => KEY_C)
rk.remap(KEY_C => KEY_A)
A を B, B を C, C を A と変換したい場合は次のように書く:
rk.remap(
KEY_A => KEY_B,
KEY_B => KEY_C,
KEY_C => KEY_A
)
#remap で実現できないような複雑な処理は、後述の #match や #start で書くことができるかもしれない。
Rkremap#start
なにかキーを押されたらブロックを実行する。修飾キー単体ではブロックは実行されない。
ブロックの引数はキーコード(Integer)と修飾キー(Hash)と Rkremap::App。
Rkremap::App#class_name でアプリのクラス名、Rkremap::App#title でアプリのタイトルを取得できる。
Rkremap#match
キーイベントが引数に適合するとブロックを実行する。ブロック引数は Rkremap::Event オブジェクト。
Rkremap::Event#skip するとこのイベントはスキップされる。
複数回指定した場合は記述順に実行される。
Rkremap#key
キーを押したことにする。引数はキーコード(Integer)と修飾キー(Hash)。
修飾キーのハッシュのキーはキーコード(KEY_LEFTCTRL 等)、値は true, または false。
{
KEY_LEFTSHIFT => false,
KEY_LEFTCTRL => true,
}
と指定すると、左シフトは離した状態、左Ctrlは押した状態、それ以外の修飾キーはそのまま。
#key() 処理後は処理前の修飾キーの状態に戻る。
Rkremap#event
キーイベントを発生させる。code 引数はキーコード(Integer)。type 引数はイベントタイプ(Symbol)で :press, :release。
Rkremap#synchronize
start や match のブロックは同時に実行されないようにするため Mutex を使用している。このメソッドで同じ Mutex を用いた排他制御を行う。
Rkremap::CODE_KEY
コードからキー名のシンボルに変換するための Hash。
Rkremap::Event
Rkremap::Event#code
キーコード。Rkremap::KeyCode::KEY_* に該当。
Rkremap::Event#type
イベントタイプ。 :press, :release, :repeat のいずれか。
Rkremap::Event#app
Rkremap::App。イベントが発生したアプリケーション。
Rkremap::Event#skip
このイベントをこれ以降処理しない。
Rkremap::App
Rkremap::App#class_name
アプリケーションのクラス名。
Rkremap::App#title
アプリケーションのタイトル。
参考
- mooz/xkeysnail: Yet another keyboard remapping tool for X environment
- k0kubun/xremap: Dynamic key remapper for X11 and Wayland
- kui/rbindkeys: key remap with ruby
- Linux の入力デバイスをカスタマイズ - Qiita
- Linux Input Subsystemの使い方
- 1. Linux Input Subsystem userspace API — The Linux Kernel documentation
License
MIT license