Ubuntu 20.04でキーマップをカスタマイズする

前回に引き続き、久しぶりにUbuntuを触ったらてこずったのでメモ。

Linuxでキーマップをカスタマイズする方法といったらXmodmapだったが現在は違うらしい。 Xmodmapでも一時的にキーマップは変わるが、いつのまにか元に戻ってしまう。 代わりに現在ではxkbというものを使うらしい。

調べたところ設定方法はいくつかありそうだった

自分の場合はキーマップの設定はdotfilesで管理したいため2番目の方法を採用した。 ホームディレクトリ以下に追加のキーマップを定義するファイルを作成し、ログイン後に読み込むことにする。

設定したいキーマップ

以下のようにキーマップに変更したい。

  • Caps LockControl
  • 無変換Control
  • 変換Shift
  • (Apple Magic Keyboard) 英数Control
  • (Apple Magic Keyboard) かなControl

xkbのドキュメントをすべて読めば書き方がわかるのかもしれないが、よくわからなかったのでひとまずネット上の記事を参考にして書いた。

$ mkdir -p $HOME/.xkb/symbols
$ cat - <<EOF >$HOME/.xkb/symbols/custom
partial modifier_keys

xkb_symbols {
    key <CAPS> { [ Control_L, Control_L ] };
    modifier_map Control { <CAPS> };

    key <MUHE> { [ Control_L, Control_L ] };
    modifier_map Control { <MUHE> };

    key <HENK> { [ Shift_R ] };
    modifier_map Shift { <HENK> };

    key <HJCV> { [ Control_L, Control_L ] };
    modifier_map Control { <HJCV> };

    key <HNGL> { [ Shift_R ] };
    modifier_map Shift { <HNGL> };
};
EOF

CAPS、MUHEなどの文字列は

  1. xevでkeycodeを調べて
  2. /usr/share/X11/xkb/keycodes/evdevからkeycodeに対応する行を探す

で見つけることができる。

Control_L, Control_Lと書いている箇所の2つめのControl_LはShiftを押しながそのキーを押したときもControlとして動作させるため。 後述するが期待通り動いていない。

上で定義したcustomシンボルを上書きで読み込めばよい。現在のキーマップを調べてcustomを追加する。

$ setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+jp+us:2+inet(evdev)"        };
        xkb_geometry  { include "pc(pc105)"     };
};

の場合は、

$ cat - <<EOF >$HOME/.keymap.xkb
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+jp+us:2+inet(evdev)+custom" };
        xkb_geometry  { include "pc(pc105)"     };
};
EOF
$ xkbcomp -I$HOME/.xkb $HOME/.keymap.xkb $DISPLAY 2>/dev/null

最後のxkbcompで適用される。このコマンドをログイン時に自動で実行されるようにすればよい。

課題

  • Shift+Caps+aでShift+Ctrl+aと同じように動作してほしいがうまくいかない
  • サスペンドからの復帰後に元に戻ってしまう

参考

関連記事

comments powered by Disqus