Ubuntu 16.04 で XKB を使ってキーマップをカスタマイズする
いつも分からなくなるのでメモ
概要
こんなことがやりたくなったら、キーマップをカスタマイズすることになる。
- JIS 配列キーボードを使っているが、US 配列として使いたい
- Caps Lock を Control に割り当てたい
やり方は幾つかあるようだ。XKB を使う方法、.Xmodmap を編集する方法。
XKB の方が新しい仕組みなので、そっちでやる。
下準備
デスクトップ右上のキーボードアイコンから「設定」をクリックし、「入力メソッドの設定」画面を出す。
キーボード - 日本語
Mozc
のように表示されているかと思う。 Mozc で直接入力モードと変換モードを切り替えつつ使えばよく、 「キーボード - 日本語」が残っている意味がないと思うので Mozc だけにする。
Mozc
次に、dconf-editor をインストールして /org/gnome/settings-daemon/plugins/keyboard/active
を 0 に設定する。
$ sudo apt install dconf-editor
$ dconf-editor
左側のリストから org > gnome ... とたどっていく。active からチェックマークをはずす。 active 0 とすることにより、スリープからの復帰や入力メソッドの切り替え時に XKB の設定値が初期化されないようになる。
参考:http://blog.goo.ne.jp/ikunya/e/86c7c228787112acd3a664c1a4e31ef3 の 2014-05-11 05:44:30 のコメント
XKB の設定
xkbで無変換にctrlを割り当てる が参考になる。
キーボードレイアウトを US 配列とし、Caps Lock を Control に割り当て、その他ちょっとしたキーマップのカスタマイズを行う。
ファイル構成はこうなる:
$HOME/.xkb/
keymap/
mykbd
symbols/
custom
keymap/mykbd が主となるファイル。ベースとなるファイルを setxkbmap で作成し、それを編集していくと便利。
$ setxkbmap -print > ~/.xkb/keymap/mykbd
中身はこんな感じ。変更したのは xkb_symbols の行だけ。
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us+inet(evdev)+custom(jpus)+custom(ctrl)+custom(kana)" };
xkb_geometry { include "pc(pc105)" };
};
symbols/custom は先ほどのキーマップファイルから include されているファイル。こんな中身。
xkb_symbols "jpus" {
replace key <AE13> { [ backslash, bar ] };
replace key <AC12> { [ Return ] };
};
xkb_symbols "ctrl" {
replace key <CAPS> { [ Control_L ] };
modifier_map Control { <CAPS> };
};
xkb_symbols "kana" {
replace key <NFER> { [ Muhenkan ] };
replace key <XFER> { [ Henkan ] };
};
設定のまとまりごとに jpus とか ctrl とかの名前を付けて分けているが、すべてまとめてもよいはず。
JIS 配列を無理やり US 配列にすると、"|\" と印刷されたキーを押しても何も反応しなくなる。 その代わり、"}]" と印刷されたキーを押すと "|\" と入力される。 やっぱりバックスペースの位置は右上であってほしい。そのための設定が jpus だ。
replace key <AE13> { [ backslash, bar ] };
は "|\" キーで "|\" を入力するための設定。
replace key <AC12> { [ Return ] };
は "}]" キーで Return を入力するための設定。
AE13 や AC12 というのは /usr/share/X11/xkb/symbols/jp
から見つけた名前。
~/.xkb/keymap/mykbd をログイン時に読み込ませる
X 起動時に先ほど定義したキーマップファイルを読み込ませるように設定する。
Gnome のアプリケーション自動起動機能を使うことにした。
まずキーマップファイルを読み込ませるスクリプトを準備しておく。
~/bin/load_xkbmap.sh
#!/bin/sh
if [ -s $HOME/.xkb/keymap/mykbd ]
then
sleep 1
xkbcomp -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY 2>/dev/null
fi
sleep を入れておかないと、タイミング問題で上手く適用されない場合がある。 自分の環境では 1 秒で十分安定するようだが、適宜 sleep 時間を調整してほしい。
スクリプトに実行権限を付けておく。
$ chmod +x ~/bin/load_xkbmap.sh
手動で load_xkbmap.sh を実行して、希望のキーマップになっていることを確認する。
キーマップがうまく設定できたら自動起動するようにしておく。
$ gnome-session-properties
で自動起動設定画面が開くので、項目を 1 つ追加する。
- 名前:Load XKB Map (なんでもいい)
- コマンド:/home/.../bin/load_xkbmap.sh
これで、起動時に独自キーマップが自動で読み込まれる。