xkbを使って修飾キー有のキーバインドを設定する
Windowsのキーバインド設定ツールとして以前から KeyExtension というフリーソフトを使わせてもらっています。 変換キー + U でHome、変換キー + H でLeft、といった感じの設定ができます。 Vimでコードを書く時は困らないのですが、Eclipseなど他のエディタで作業するような時は カーソル移動が楽になるので大変愛用しています。
これと同じことを Elementary OS で実現できないかと調べたところ、 xkbを使うことで可能になるようです。早速試してみました。
設定したいキーバインドは以下です。
キー | 動作 |
---|---|
変換キー + U | Home |
変換キー + O | End |
変換キー + H | Left |
変換キー + J | Down |
変換キー + K | Up |
変換キー + L | Right |
変換キー + ; | Delete |
変換キー + B | BackSpace |
変換キー + N | Return |
まずは、変換キーを押した時に修飾キー(Mod5)として認識させます。
$ cat ~/.xkb/compat/mycompat xkb_compatibility "henkan" { interpret Henkan_Mode { action = SetMods(modifiers=Mod5); }; };
キーバインドに使う型として、Shiftと変換キー(Mod5)を組み合わせた型として定義します。 Shift+の時はLevel2に設定した動作、変換キー+およびShift+変換キー+*の時はLevel3に設定した動作をします。
$ cat ~/.xkb/types/mytypes xkb_types "henkan" { type "HENKAN" { modifiers = Shift+Mod5; map[Shift] = Level2; map[Mod5] = Level3; map[Shift+Mod5] = Level3; level_name[Level1] = "Base"; level_name[Level2] = "Shift"; level_name[Level3] = "Henkan"; }; };
キーバインドを設定します。
左から順に、修飾キーなし(Level1)、Shiftキーあり(Level2)、変換キーあり(Level3)、の動作を設定します。
HomeやBackSpaceのところに何を書けば良いかわからないときは
$ xev
で目的のキーを打ち込んでみて表示されるkeysymを確認すれば良いようです。
$ cat ~/.xkb/symbols/mysymbols xkb_symbols "henkanmodekeys" { key <AD07> { type="HENKAN", [ u, U, Home ] }; key <AD09> { type="HENKAN", [ o, O, End ] }; key <AC06> { type="HENKAN", [ h, H, Left ] }; key <AC07> { type="HENKAN", [ j, J, Down ] }; key <AC08> { type="HENKAN", [ k, K, Up ] }; key <AC09> { type="HENKAN", [ l, L, Right ] }; key <AC10> { type="HENKAN", [ semicolon, plus, Delete ] }; key <AB05> { type="HENKAN", [ b, B, BackSpace ] }; key <AB06> { type="HENKAN", [ n, N, Return ] }; };
以上の設定を組み込むための定義を行います。 ベースとなる設定ファイルを生成して修正します。
$ setxkbmap -print > ~/.xkb/keymap/mykbd $ cat ~/.xkb/keymap/mykbd xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete+mytypes(henkan)" }; xkb_compat { include "complete+japan+mycompat(henkan)" }; xkb_symbols { include "pc+jp+inet(evdev)+mysymbols(henkanmodekeys)" }; xkb_geometry { include "pc(pc105)" }; };
テストします。
$ xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY
ログイン時に反映させるために~/.bashrcに以下を追記します。
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
以下のページが大変参考になりました。