MacのVirtualBoxでゲストOSのキーを入れ替える

2015年3月19日木曜日

Mac

t f B! P L
普段、Macのキーボードは 左Controlキーと左Commandキーを入れ替えて使っています。入れ替えは、単純にSystem PreferencesのKeyboardを開いてModifier Keys...のControl KeyとCommand Keyの入れ替えで行っています。
この方法で、ほとんどの操作は左Controlキーと左Commandキーが入れ替わります。ただ、次の場合はキーが入れ替わりませんでした。 ・ターミナル上でキーを入力するとき ・VirtualBox上のubuntuゲストOSでキーを入力するとき ターミナルは使用頻度が少ないので我慢出来るとして、VirtualBox上のubuntuでキーが入れ替わらないのは辛くなってきたので、ゲストOSのubuntu(14.04LTS)上でxmodmapを使ってキーを入れ替えることにしました。 手順は次の5ステップです。 1. VirtualBoxのホットキーの設定を変更する 2. Macのキーボードとキーの対応を調べる 3. xmodmapの現在の割り当てを調べる 4. xmodmapの設定ファイルを作る 5. xmodmapの実行

ubuntu 14.04LTSのxmodmapでキーを入れ替える

最初はネットを検索してキーの入れ替えを試していたのですが、結局xmodmapのmanページに書いてある例が一番参考になりました(当たり前か)。
$man xmodmap
XMODMAP(1)                  General Commands Manual                 XMODMAP(1)

NAME
       xmodmap  - utility for modifying keymaps and pointer button mappings in
       X

SYNOPSIS
       xmodmap [-options ...] [filename]
:
:
:
       One of the more irritating differences between keyboards is  the  loca‐
       tion  of  the Control and CapsLock keys.  A common use of xmodmap is to
       swap these two keys as follows:
       !
       ! Swap Caps_Lock and Control_L
       !
       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

       This example can be run again to swap the keys back to  their  previous
       assignments.
manページの例は、Caps Lockキーを左Controlキーを入れ替えています。これを参考に左Controlキーと左Comanndキーを入れ替えてみます。

1.VirtualBoxのホットキーの設定を変更する

VirtualBoxではホストとゲストOSの切り替えにホットキーが設定されています。初期状態では左Commandキーが設定されているので、これを変更します。変更にするには、まずVirtualBoxのPreferences...からInputを選択して、Virtual MachineのHot Key Combinationを選択します。僕はホットキーを使わないので無効にしています。無効にする場合は、右端の消しゴムIconをクリックすると設定がNoneになります。
HotKey初期設定状態

HotKeyを無効にした状態

2.Macのキーボードとキーの対応を調べる

xevを使って、Macのキーを押した時にubuntuでどのように認識されているかを調べます。調べ方は、ubuntuのターミナルからxevを起動して、表示されるウィンドウ上で左Controlキーと左Commandキーをそれぞれ押します。 左Controlキーを押した結果はこれです。
KeyPress event, serial 37, synthetic NO, window 0x4600001,
    root 0x175, subw 0x0, time 281565, (101,54), root:(206,240),
    state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False
左Commandキーを押した結果はこれです。
KeyRelease event, serial 37, synthetic NO, window 0x4600001,
    root 0x175, subw 0x0, time 279861, (101,54), root:(206,240),
    state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
左ControlキーはControl_L、左CommandキーはSuper_Lということがわかりました。

3.xmodmapの現在の割り当てを調べる

ターミナルでxmodmapを実行して現在の設定を表示します。左Controlキー(Control_L)はcontrolに、また左Commandキー(Super_L)はmod4というmodifierに属していることがわかります。
$xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  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)

4.xmodmapの設定ファイルを作る

キーの入れ替えを記述したファイルを作ります。ここでは.Xmodmapというファイルに入れ替えの設定を記述しました。
remove control = Super_L
remove mod4  = Control_L
keysym Control_L = Super_L
keysym Super_L = Control_L
add mod4 = Control_L
add control = Super_L

5.xmodmapの実行

ターミナルで設定ファイルを指定してxmodmapを実行すると、左Controlキーと左Commandキーが入れ替わります。
$ xmodmap .Xmodmap
manページに書いてある通り、xmodmapをもう一度実行すると、再度差し替え(スワップ)されることになるので、設定が元に戻ります。

このブログを検索

QooQ