Ubuntu16.04でCapsLockとCtrlを入れ替える

自宅のPCをUbuntuにしたので環境整え

調べながらやったら結構面倒だったので備忘

参考 http://d.hatena.ne.jp/aaa555/touch/searchdiary?word=*%5BLinux%5D
http://blog.cnu.jp/blog/2014/05/12/use-xkb/

設定ファイルの雛形を準備

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

.xkb/keymapディレクトリと.xkb/symbolsディレクトリを作成
現在システムに設定されているkeymap(?)をmykbdという名前で~/.xkb/keymapに配置する
setxkbmapコマンドにprintオプションをつけると現在値を標準出力してくれるらしい

変更するキーバインドの設定

$ vim ~/.xkb/symbols/myswap

やりたいことはCapsLockと左Ctrlの入れ替え
myswapに以下のように記述する

partial modifier_keys
xkb_symbols "swapkeys" {
    replace key <LCTL> { [ Caps_Lock ] };
    replace key <CAPS> { [ Control_L] };
};

上記設定をmykbdに反映する

$ vim ~/.xkb/keymap/mykbd

雛形は準備されているので+myswap(swapkeys)の部分を追加します

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)+myswap(swapkeys)"   };
    xkb_geometry  { include "pc(pc105)" };
};

システムに設定を追加する

このままだと日本語入力に切り替えたタイミングで設定が戻ったりしてしまうので、システムに反映します

$ vim ~/.bashrc

以下を末尾に追加する

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

作成したmyswapファイルをシステムのほうにコピーする

sudo cp -i ~/.xkb/symbols/myswap /usr/share/X11/xkb/symbols/

/usr/share/X11/xkb/rules/evdev の末尾に次の1行を追加

$ vim /usr/share/X11/xkb/rules/evdev

以下を末尾に追加する

mysetting:swapkeys = +myswap(swapkeys)

gnomeのシステム設定に反映させる

$ gsettings set org.gnome.desktop.input-sources xkb-options "['mysetting:swapkeys']"

再起動すればちゃんと設定が保持されます