この記事ではxmodmapを用いてキーバインドを変更する方法を解説します。
私はxmodmapを用いて以下のようなキーバインドにしました。
・ 変換 → ESC
・ 無変換 → 変換 (無変換で変換)
・ CapsLock → Ctrl_L
・ Ctrl_L → CapsLock
このような設定にすることで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を調べ上げます。私は以下のようになりました。
物理的なキー | keycode | keysym(現在) | keysym(なにに変更するか) |
CapsLock | 66 | Eisu_toggle | Control_L |
Ctrl_L | 37 | Control_L | Eisu_toggle |
無変換 | 102 | Muhenkan | Zenkaku_Hankaku |
変換 | 100 | Henkan_Mode | Escape |
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をクリーンインストールしたときにスペースを忘れてエラーがでました。