読者です 読者をやめる 読者になる 読者になる

Happy My Life

日常とか技術とか

xkbでキーバインドを変更する

Linux

Ubuntu 12.04を利用している時、キーバインドの変更(例えばCaps LockとCtrlの入れ替えなど)は、.Xmodmapファイルをホームディレクトリに配置するだけで対応できてきた。 で、最近インストールしたUbuntu 14.04では、この方法では変更できなかった。

で、いろいろ調べていくと、Xmodmapは事実上の廃止状態で、Ubuntu 13.10以降ではxkbを利用するのが正攻法ってことらしい。ので、xkbキーバインドを変更する方法を色々調べてみた。

xkbで設定を行えば、X window上で動作しているすべてのアプリに設定が反映されるので。

Caps LockとCtrlの入れ替え程度であれば、xkb以外にも方法があるのだが、xkbを使う方法では、「;キー」にenterキーを割り当てるなど変則的な対応もできるのが魅力。

変更は次のように行う。

xkbでキーバインドを変更する

設定は、keyboard layout - Use setxkbmap to swap the Left Shift and Left Control - Unix & Linux Stack Exchangeに書かれている方法を元に行ってみた。

基本的な流れは次の通り

  1. ~/.xkb/keymapフォルダにベースとなる設定ファイルを格納
  2. ~/.xkb/symbolsフォルダに変更するキーバインドを定義したファイルを格納
  3. 起動時に設定が反映されるように設定

まずベースとなる設定ファイル(mykbdファイル)を作成する。

$ mkdir -p ~/.xkb/keymap ~/.xkb/symbols
$ setxkbmap -print > ~/.xkb/keymap/mykbd

次に変更するキーバインドを設定する。ここではCapsLockとCtrlの入れ替え、チルダとEscキーの入れ替え(USキーボード使ってるので)

$ cat ~/.xkb/symbols/myswap
partial modifier_keys
xkb_symbols "swapkeys" {
  replace key <ESC> {[ quoteleft, asciitilde ] };
  replace key <TLDE> {[ Escape ] };
  replace key <LCTL>  { [ Caps_Lock ] };
  replace key <CAPS> { [ Control_L ] };
};

ここではとかquoteleftなどといったようにキー指定を行っているが、これらのキー指定の方法はxkb特有のもの。他のキーを指定する方法は、/usr/share/X11/xkbフォルダ以下にあるファイルをいろいろ見ていけば分かるかと。

myswapファイルの内容を、mykbdファイルに反映するように指定する。xkb_symbolsの項目のの最後に"+myswap(swapkeys)“を追加する。一例として、追加後のファイルはこんな感じ。

$ cat ~/.xkb/keymap/mykbd
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+inet(evdev)+myswap(swapkeys)"    };
    xkb_geometry  { include "pc(pc105)" };
};

設定を起動時に反映させるように、.bashrcファイル(bashの場合)に以下の一文を追加する。

xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null

あとは、再ログインしたら設定が反映される。