WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

X Windowのキーバインドをカスタマイズ

      2012/11/30

X上でのキーバインドの変更

Xでのキーバインドの変更はxmodmapコマンドで行えます。
ここでは例としてCtrlとCaps Lockを入れ替えてみます。
まず、下記のようにホームディレクトリに設定ファイルを作成します。

[user@centos ~]$ vi ~/.xmodmaprc
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

作成したファイルをxmodmapコマンドで読み込むとキーバインドの変更が反映されます。

[user@centos ~]$ xmodmap ~/.xmodmaprc

元に戻すときはもう一度xmodmapコマンドで同じソースファイルを読み込みます。

[user@centos ~]$ xmodmap ~/.xmodmaprc

設定ファイルの編集

keycode(キーコード)とkeysym(キーシンボル)

上記で作成した設定ファイルを自分に合ったキーバインドになるようにカスタマイズします。
例えば、設定ファイルに下記のように記述すると、”カタカナひらがな”キーに”半角/全角”キーを割り当てることができます。

[user@centos ~]$ vi ~/.xmodmaprc
keycode 208 = Zenkaku_Hankaku

keycode(キーコード)というのは、キーボード上のキーに一意に割り当てられた番号のことです。
また、上記の”Zenkaku_Hankaku”の部分は、keysym(キーシンボル)となっています。
keysymは、そのキーがどういう役割を持つのかを表すIDのようなものです。

つまり、特定のキーに任意のキーを割り当てるといった設定を行うには、上記のように、
keycode = keysym
という形式で定義するため、設定したいキーのkeycodeとkeysymを知る必要があります。

keycodeとkeysymは、xevというツールで調べることができます。

[user@centos ~]$ xev

xevコマンドを実行すると下図のように”Event Tester”というウィンドウが現れます。
そして、何らかのキーを押すと多数のメッセージが表示されます。
ここで、keycodeを調べたいキーを押せば、keycodeが表示されます。
また、keycodeに割り当てられたkeysymも同時に確認できます。

また、xmodmapコマンドに-pkeというオプションを付けて実行すると、現在のkeycodeとkeysymの対応表が表示されるので便利です。

[user@centos ~]$ xmodmap -pke
keycode   8 =
keycode   9 = Escape
keycode  10 = 1 exclam kana_NU
keycode  11 = 2 quotedbl kana_FU
keycode  12 = 3 numbersign kana_A kana_a
keycode  13 = 4 dollar kana_U kana_u
keycode  14 = 5 percent kana_E kana_e
keycode  15 = 6 ampersand kana_O kana_o
keycode  16 = 7 apostrophe kana_YA kana_ya
keycode  17 = 8 parenleft kana_YU kana_yu
keycode  18 = 9 parenright kana_YO kana_yo
keycode  19 = 0 asciitilde kana_WA kana_WO
keycode  20 = minus equal kana_HO
- 略 -

keycode 10 = 1 exclam kana_NU
のように3つのkeysymが設定されているものがあります。
これは、それぞれ「普通にキーを押した場合の keysym」、「Shiftキーを押しながらキーを押した場合の keysym」、「モディファイヤキーを押しながらキーを押した場合のkeysym」を意味しています。

設定ファイルの文法・ディレクティブ

設定ファイル内では行頭に!をつけるとその行はコメントとなります。

! この行はコメント行

keycode 数字 = keysym
で左辺で指定したkeycodeを持つキーに右辺で指定したkeysymの役割を割り当てることができます。
下記はkeycode49(半角/全角キー)にEscapeキーを割り当てる場合

! 半角/全角にEscapeを割り当て
keycode 49 = Escape

clear モディファイヤ名
で指定したモディファイヤ名のキーエントリをすべて無効することができます。
“clear Shift”とすると、Shiftキーとあるキーの組み合わせがすべて無効になります。
例えば、通常ならShiftキー+アルファベットで大文字アルファベットの入力ができるものが”clear Shift”により無効化されるようになります。
なお、モディファイア名は大文字小文字の区別がされません。

! Shiftキーとその他のキーの組み合わせを無効化する
clear shift
! ※モディファイヤ名の大文字小文字は区別されないため、下記でも同様の設定ができる
clear SHIFT
! 下記は元に戻す場合
add shift = Shift_L
add shift = Shift_R

有効なモディファイヤ名はShift/Lock/Control/Mod1/Mod2/Mod3/Mod4/Mod5です。
現在のモディファイヤマッピングの状態はxmodmapコマンドを-pmオプションを付けて実行することで確認できます。

[user@centos ~]$ xmodmap -pm
xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x25)
control     Control_L (0x42),  Control_R (0x6d)
mod1        Alt_L (0x40),  Alt_L (0x7d),  Meta_L (0x9c)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x7f),  Hyper_L (0x80)
mod5        Mode_switch (0x5d),  ISO_Level3_Shift (0x7c),  Mode_switch (0x81)

remove モディファイヤ名 = keysym
で指定したkeysymを含む全てのキーを指定されたモディファイヤマップから消去します。

! 右Shiftキーをモディファイア「Shift」から削除
remove shift = Shift_R
! 元に戻す場合
add shift = Shift_R

add モディファイヤ名 = keysym
で指定したkeysymを含む全てのキーを指定されたモディファイヤマップに追加します。

! 右Altキーをモディファイア「Shift」に追加
add shift = Alt_R
! 元に戻す場合
remove shift = Alt_R

 - デスクトップ用途 , , , , , ,