xmodmapによるキーバインドの変更 (Ubuntu18.04)

この記事ではxmodmapを用いてキーバインドを変更する方法を解説します。

私はxmodmapを用いて以下のようなキーバインドにしました。
変換 ESC
無変換変換 (無変換で変換)
・ CapsLockCtrl_L
・ Ctrl_LCapsLock

このような設定にすることでVimが使いやすくなり、普段使いも快適になりました。Vimではモードを変更するときにESCを押さないと行けないのですがデフォルトのキーバインドではESCが遠すぎて不便でしたが、変更後はESCが親指のすぐそばに居てくれるので、なかなか使いやすいです。

手順をざっと説明すると、キーバインドを変更したいキーの番号keycodeを調べてそれに与えたい役割 keysym( 押された時に何を入力するか )を与えることでキーバインドを変更していきます。

keycodeとkeysymを調べる

まずは物理的なキーの番号keycodeと役割keysym調べます。

xevというコマンドを用いて調べます。

$ xev

xevコマンドを実行した状態で何かキーを押すと下のような文字列が出力されると思います。これはESCを押した時のものです。

KeyPress event、 serial 37、 synthetic NO、 window 0x5c00001、
        root 0xfd、 subw 0x0、 tie 109723727、 (-404、427)、 root:(715、479)、
        state 0x0、 keycode 9 (keysym 0xff1b、 Escape)、 same_screen YES、
        XLookupString gives 1 bytes: (1b) ""
        XmbLookupString gives 1 bytes: (1b) ""
        XFilterEvent returns: False

KeyRelease event、 serial 37、 synthetic NO、 window 0x5c00001、
        root 0xfd、 subw 0x0、 time 109723887、 (-404、427)、 root:(715、479)、
        state 0x0、 keycode 9 (keysym 0xff1b、 Escape)、 same_screen YES、
        XLookupString gives 1 bytes: (1b) ""
        XFilterEvent returns: False

これを見るとESCはkeycodeが9でkeysymがEscapeであることがわかります。
この要領で変更したいキーのkeycodeと変更後のkeysymを調べ上げます。私は以下のようになりました。

物理的なキーkeycodekeysym(現在)keysym(なにに変更するか)
CapsLock66Eisu_toggleControl_L
Ctrl_L37Control_LEisu_toggle
無変換102MuhenkanZenkaku_Hankaku
変換100Henkan_ModeEscape
keycode 102 = Zenkaku_Hankaku
keycode 100 = Escape

上記のコードを~/.Xmodmapに書き、

$ xmodmap ~/.Xmodmap

上記のコマンドを実行することで
keycode102にZenkaku_Hankakuのkeysymを
keycode100にEscapeのkeysymを
与えることができます。
くどいですが、無変換のキーを押すことで全角半角が入力されたことになり、変換のキーを押すことでEscapeが押されたことになります。

CapsLockとCtrl_Lについてはもう少しやらないといけないことがあるので、この後にやります。

モディファイアキー

今回はCapsLockやCtrl_Lがモディファイアキーなのでそれらの設定を行うために、モディファイアキーを調べる必要があります。

モディファイアキーは日本語で言うと修飾キーのことで、shiftやCtrlのように他のキーの入力文字を変えるキーのことです。

例えば、aだけを押すとaと入力されますが、shiftを押しながらaを押すとAが入力されます。

xmodmapコマンドを使うことでモディファイアキーを調べることができます。

$ xmodmap

これを実行すると

xmodmap: up to 4 keys per modifier、 (keycodes in parentheses):

shift Shift_L (0x32)、 Shift_R (0x3e)
lock Caps_Lock (0x25)
control Control_L (0x42)、 Control_R (0x69)
mod1 Alt_L (0x40)、 Alt_R (0x6c)、 Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85)、 Super_R (0x86)、 Super_L (0xce)、 Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c)、 Mode_switch (0xcb)

これの見方は左端がモディファイアキーの機能で、2列目以降がそのモディファイアキーの機能を与えられているkeysymです。

例えばShift_LとShift_Rはshiftグループに属しており、shiftの機能が与えられています。

ごちゃごちゃ言いましたが、モディファイアキーに割り当てられているキーのkeysymを変更する場合はまず、モディフィアキーのグループから取り除く必要があります。

remove lock = Caps_Lock
remove control = Control_L

一度lockグループからCaps_Lockを取り除き、controlグループからControl_Lを取り除きます。
keysymを変更した後で再度lockグループにCaps_Lockを加え、controlグループにControl_Lを加えます。

add lock = Caps_Lock
add control = Control_L

実際の設定

以上を踏まえて~/.Xmodmapに以下のコードを書きました。

remove control = Control_L
keycode 66 = Control_L
keycode 37 = Eisu_toggle
keycode 102 = Zenkaku_Hankaku
keycode 100 = Escape 
add lock = Caps_Lock
add control = Control_L

この設定ファイルを

$ xmodmap ~/.Xmodmap

で読み込むことでキーバインドを変更できます。

以上です。

2020 10/5追記
イコールの前後はスペースを一つ開けてください.でないとエラーがでます。
ubuntuをクリーンインストールしたときにスペースを忘れてエラーがでました。