xkbでキーバインドを変更する(Ubuntu)
Ubuntuにおけるキーバインド変更の方法です。「xkb」を使って設定します。
以前業務でWindowsを使っていたときはAutoHotKeyでキーバインドを変更していました。 とても便利だったのでUbuntuでもやりたいと思っていたのですが、Ubuntuで設定しないまま結構たっていました。
AutoHotKeyほどテクニカルのことはできなさそうですが、別のキーに割り当てるくらいはできそうなのでxkbを使って対応しようと思います。
作業の効率、特にVimの効率が上がるのでやっておきます。以下に手順とxkbの詳細を残しておくので何かの参考になればと思います。
結論を先に書くと
以下にキーバインド設定ファイルを作成します。
~/.xkb/symbols/myswap
partial modifier_keys
xkb_symbols "swapkeys" {
key <AB11> { [ underscore, backslash ] };
key <MUHE> { [ Escape, Escape ] };
key <HENK> { [ BackSpace, BackSpace] };
key <HKTG> { [ Return, Return] };
key <LALT> { [ Control_L, Control_L] };
key <LCTL> { [ Alt_L, Alt_L] };
};
以下に設定ファイルの呼び出しを定義します。
各環境で内容が異なる場合があるので、変更前に一度設定内容を確認しましょう。
~/.xkb/keymap/myxkb
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)" };
};
以下のコマンドを実行して設定を反映させます。 コマンドはbash起動時などに実行されるようにするのがおすすめです。
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
概要
ざっくり以下の手順です。
- xkbの設定を確認する
- キーコード・キーシンボルを探す
- キーバインド設定ファイルを作成
- xkb設定ファイルを作成
- 設定を反映させるコマンドを実行
以下詳細な手順を記載しています。各環境に合わせて設定してください。
xkbの設定を確認する
以下のコマンドを実行してxkbの設定を確認します。
setxkbmap -print
以下のような出力を得られます。現在有効なxkbの設定です。
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)" };
xkb_geometry { include "pc(pc105)" };
};
出力内容の意味
以下の順に設定されます。
今回変更するのはsymbolsの設定です。設定したキーバインドのルールを作成してsymbolsの定義に追加します。
-
geometry
物理キーボードの規格を指定指定します。英字キーボードか日本語キーボードかです。
-
type
キー配置のレベル と グループ を定義します。
レベルとは、修飾キーで1つのキーに複数の機能をもたせるための設定です。aとAとかのことです。 キーのレベル1に通常入力(a)、レベル2に Shift キー押下状態での機能(A)が例です。レベルは2より多く設定できるそうです。
グループとは、キーボード全体の配置を入れ替えるための設定です。英数入力と日本語入力の切り替えのことです。詳細はよくわかりません。グループは 8個まで設定できるそうです。
-
compat
type に対応するキーマップの設定です。
-
keycodes
キーコードとキーシンボルの対応関係を設定します。物理キーボードのキーに割り当てられた1~3桁の数字がキーコードです。キーシンボルはキーコードに対して分かりやすい名称を対応させたものになります。
-
symbols
キーシンボルに「a/A を入力する」「shift キーの機能をもたせる」といった役割を割り当てます。
キーコード・キーシンボルを探す
xev を使ってキーコードを調べます
xev
コマンドを実行すると入力待ちになるので、キーを入力します。 すると入力したキーに対応するキーコード(1~3桁の数字)が出力されます。 それをメモしておきます。以下の出力のkeycode ..のところです。
KeyRelease event, serial 37, synthetic NO, window 0x3e00001,
root 0x190, subw 0x0, time 872427349, (569,389), root:(1940,496),
state 0x0, keycode 54 (keysym 0x63, c), same_screen YES,
XLookupString gives 1 bytes: (63) "c"
XFilterEvent returns: False
例えば無変換は102、変換は100、ひらがなカタカナは101でした。
キーコードを使ってキーシンボルを探します
以下のファイルに対応が書かれています。開いて検索しましょう。
/usr/share/X11/xkb/keycodes/
の evdevとaliasesに書かれているものが有効なものです。
aliasesの方はキーシンボルのエイリアスが書かれているものなので、ここでは必要ないです。evdevの方のみ確認しましょう。
上記でメモしたキーコードを探して対応するキーシンボルをメモします。
例えば102は「MUHE」、100は「HENK」、101は「HKTG」でした。 これで変更したいキーのキーシンボルがわかりました。
キーバインド設定ファイルを作成
ディレクトリを作成
mkdir ~/.xkb/keymap
以下のような設定ファイルを作成します。
~/.xkb/keymap/myswap
partial modifier_keys
xkb_symbols "swapkeys" {
key <MUHE> { [ Escape,Escape ] };
key <HENK> { [ Return ] };
key <HKTG> { [ BackSpace,Delete ] };
replace key <LCTL> { [ Caps_Lock ] };
replace key <CAPS> { [ Control_L ] };
};
変換・無変換をそれぞれReturn・Escに割り当てること、カタカナキーをバックスペースとデリート、ctrlとcaps lockの入れ替えをしています。
カンマ区切りの箇所はレベルを指定しています。BackSpace,Delete
なので通常はバックスペースで、シフト押しながらでデリートです。
swapkeysのところは任意のルール名を定義しています。あとで設定を反映するときに使います。
xkb設定ファイルを作成
ディレクトリを作成 mkdir ~/.xkb/symbols
以下のファイルを作成
~/.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)" };
};
xkb_symbols の箇所に追記しています。先程定義したルールのルール名を追加します。
パソコンによって定義内容が違うかもしれませんので、上記をまるごとコピペはしないほうがよいです。自身の環境の設定内容を一度確認した上で追加分のルールを足しましょう。
設定を反映させるコマンドを実行
以下のコマンドを実行することで上記の設定ファイルが有効になり、キーバインドの変更が反映されます。 出力をnullに送っているのは、アラートメッセージが出るためです。こうしないと設定が反映されない様子でしたので、追加しておきます。
xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 2> /dev/null
ログインのたびにコマンドを実行することになるので、.bashrcなどに記述して自動で実行されるようにするのがおすすめです。
これでキーバインドが変更されました。特に親指の位置にある「変換」「無変換」は仕事してない、かつ邪魔なので、早いうちに何か他のものに変えるのがおすすめです。caps lockも邪魔なので変えてしまいましょう。