uchan note

プログラミングや電子工作の話題を書きます

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

これで、起動時に独自キーマップが自動で読み込まれる。