仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

Ubuntu16.04で任意のキーの入れ替え

久々に実機にlinux環境用意する必要に迫られてUbuntu16.04を入れた。で、キーを入れ替えようと思ってxmodmap〜〜wとかやったけどうまくいかなくて無理やり解決したのでメモ

問題

昔のエントリで「ハマった点」としていたものと同じもの。簡単にいうと「xmodmapでキーの入れ替えを設定しても日本語入力のON/OFFを一度でもするとxmodmapで設定したものが消える」という状態。

環境

Ubuntu 16.04
Thinkpad X1 Carbon (USキーボード)

やりたいこと

BackspaceキーとBackslash(bar)キー
を入れ替える、またその入れ替えが恒常的に保たれる

解決法

以下のブログを参照。ほぼ同じ方法。
xmodmap と setxkbmap。 » かけまわる子犬。

以下、自分の環境での作業メモ。

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

xkb_keycodesはevdevなので、/usr/share/X11/xkb/keycodes/evdev を見てパターンを理解。

xkb_symbols "basic" にあたりをつけて、key < BKSL >を変更、key < BKSP >が無いので追加。

/usr/share/X11/xkb/symbols/us

default  partial alphanumeric_keys modifier_keys
xkb_symbols "basic" {

    name[Group1]= "English (US)";

    key <TLDE> {>_______[     grave,>___asciitilde>_____]>______};
    key <AE01> {>_______[>______  1,>___exclam >>_______]>______};
    key <AE02> {>_______[>______  2,>___at>_____>_______]>______};
    key <AE03> {>_______[>______  3,>___numbersign>_____]>______};
    key <AE04> {>_______[>______  4,>___dollar>_>_______]>______};

--- 略 ---

    //key <BKSL> {>_____[ backslash,         bar>_______]>______};
    key <BKSL> { [ BackSpace,       BackSpace                                   ] };
    key <BKSP> { [  backslash,  bar             ]       };

いちおうこれで今のところは求める動作になっている。なんという力づく。。。

検索してみるといろいろキー入れ替えのやり方見つかって結構試してみたけど、どれも日本語入力ON/OFFで死亡した。。。なにかスマートなやり方があるのか?それともキー入れ替える人が少ないのか?という感じでした。つらい。

ちなみに解決策を与えてくれたブログの最後に

setxkbmap -option の記述方法知りたいなぁ。

と書いてあったのでいちおうメモっとくと、setxkbmap -optionの内容は/usr/share/X11/xkb/rules/base を参照すればたぶんわかる。(3年前のエントリにコメントする勇気がちょっと無い)

追記:
ctrl とcaps の入れ替えは /etc/default/keyboard に XKBOPTIONS="ctrl:swapcaps"