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

以下のページが大変参考になりました。