MacOSはゲストOSとして動かすのにライセンス的にグレーなので、もっぱらVM上でゲストになるのはLinuxとWindowsだ。 Macとこの2つのOSで操作の面ではHOME,ENDの挙動が違うことが問題になる。HOME,ENDはプログラミングでは非常に多用する。
普通ならHOME,ENDは行頭行末移動なのだが、Macでは文頭文末移動に割り当てられている。行頭行末移動は別途ctrl+←,ctrl+→というマッピングになっている。
つまり通常文頭文末移動の操作を何かのキーにリマッピングした場合、VM上のゲストOSとホストのMacで挙動が違ってダメダメになるってこと。
今まではゲスト側でctrl+←,ctrl+→をHOME,ENDに変換するという無茶なことをやっていた。
ドキュメントを見ると特定のアプリだけ設定を変える場合は設定に
<only>SAFARI</only>
みたいに書くらしい。じゃあVMwareで、このSAFARIにあたるのはなんなのか?
ソースからコンパイルするとこのキーワードを追加できるというのでやろうとしてソースを読んでいると・・・ 内部にこのような記述があった。
if ([name isEqualToString:@"com.vmware.fusion"] || [name hasPrefix:@"com.vmware.proxyApp."] || // unity [name isEqualToString:@"com.parallels.desktop"] || [name isEqualToString:@"com.parallels.vm"] || [name isEqualToString:@"com.parallels.desktop.console"] || [name hasPrefix:@"com.parallels.winapp."] || // coherence [name isEqualToString:@"org.virtualbox.app.VirtualBoxVM"]) { return [parser keycode:@"ApplicationType::VIRTUALMACHINE"]; }
VMware FusionはもうすでにVIRTUALMACHINEという名前で割り当てられている。他にもParallelDesktopとかVirtualBoxとかも同じ名前でいけるようだ。
ということでキーワードがわかった。
最新バージョン(2012-01-10現在ver7.5)ではPC風のhome/endそしてVMだけ除外という設定が
こんな感じでもうある。
なのでこいつを有効にすればよい
さらに複雑なカスタムをしたい人は↓を参考にしてみて
7.3.0ではオリジナル設定は
/Users/hoge/Library/Application Support/KeyRemap4MacBook/private.xml
に書きこんで設定画面のReload.xmlボタンを押せばリストに出てくるのでそれにチェックを入れておしまいだ。昔よりだいぶ簡単だ
ということで肝心の内容。
自分はDiamond Cursorという設定を愛用しているのだが
<item> <name>Diamond Cursor</name> <list> <item> <name>ModifierFlag::EXTRA1+WXSD to Up/Down/Left/Right</name> <appendix>(+ ModifierFlag::EXTRA1+A to Command_L+Left)</appendix> <appendix>(+ ModifierFlag::EXTRA1+F to Command_L+Right)</appendix> <identifier>remap.diamond_cursor_extra1_exsd</identifier> <autogen>--KeyToKey-- KeyCode::E, ModifierFlag::EXTRA1, KeyCode::CURSOR_UP</autogen> <autogen>--KeyToKey-- KeyCode::X, ModifierFlag::EXTRA1, KeyCode::CURSOR_DOWN</autogen> <autogen>--KeyToKey-- KeyCode::S, ModifierFlag::EXTRA1, KeyCode::CURSOR_LEFT</autogen> <autogen>--KeyToKey-- KeyCode::D, ModifierFlag::EXTRA1, KeyCode::CURSOR_RIGHT</autogen> <autogen>--KeyToKey-- KeyCode::A, ModifierFlag::EXTRA1, KeyCode::CURSOR_LEFT, ModifierFlag::COMMAND_L</autogen> <autogen>--KeyToKey-- KeyCode::F, ModifierFlag::EXTRA1, KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen> </item> </list> </item>
内容はこうなっているこの最後の2個のAとFに関する設定をVMwareだけ書き換えたいわけだ
ということでこうなった。
<?xml version="1.0"?> <root> <item> <name>ore Diamond Cursor home end for vm</name> <list> <item> <name>ore Diamond Cursor home end for vm</name> <appendix>(+ ModifierFlag::EXTRA1+A to HOME for vm)</appendix> <appendix>(+ ModifierFlag::EXTRA1+F to END for vm)</appendix> <identifier>remap.ore_diamond_cursor_vm_home_end</identifier> <only>VIRTUALMACHINE</only> <autogen>--KeyToKey-- KeyCode::A, ModifierFlag::EXTRA1, KeyCode::HOME</autogen> <autogen>--KeyToKey-- KeyCode::F, ModifierFlag::EXTRA1, KeyCode::END</autogen> </item> </list> </item> </root>
このようにonlyタグで指定する。このonly指定はitemに1個しかつけることができず、item全体をonlyにするしかできない。
書き込んだら、設定からreload XMLを押して選択肢に出てきたら、チェックを入れる。
ゲストOSに移動してみて、行頭行末移動を試してみる!できた!やったー。
今度はその逆。VMWare Fusionの以外だけ動作を変える。言い換えるとVMWare Fusionにだけ設定を適用しない。
自分はマック側の「かな」キーを「かな」と「英数」トグル動作にしていた。これはKeyRemap4MacBookがアプリケーションのIME状態を判断して送り込むキーコードを変化させている動作をしている。そしてVMWareというアプリ自体はIMEの状態というものを持ってないようだ。そのためIME状態はVMWareに切り替える直前のアプリのものを認識しているようだ。
じゃあ、このような動作をすると何が困るかというとVM上のWindowsはWindowsでアプリごとにIMEの状態を持っているしMacはMacでIMEの状態を持っている。Macの状態に引きづられて送りまれるキーコードが変わってもらうと困るのだ。
具体的にはマック側がIMEオンの場合はHiragana_katanakaキーが送り込まれていて、オフの場合はeisu_toggleというキーが送り込まれている。
単にトグルするだけの設定はver7.4.0現在
Use KANA as KANA/EISUU(toggle)
という設定でできる。こいつをVMWareにだけ適用しないようにする
設定サンプルを眺めると、かな英数トグルの記述があるのでこいつを少し改造し
<item> <name>ore toggle eisuu kana without vm</name> <appendix>KANA to KANA/EISUU (toggle)</appendix> <identifier>remap.ore_vk_jis_toggle_eisuu_kana</identifier> <not>VIRTUALMACHINE</not> <autogen>--KeyToKey-- KeyCode::JIS_KANA, KeyCode::VK_JIS_TOGGLE_EISUU_KANA</autogen> </item>
このように記述したポイントは「not」タグの記述。これは↑の「only」とは逆でこれだけは適用しないということ。 これでVMWareの時だけは、Mac側のIME状態が何にでも関わらず、「かな」キーでHiragana_KatakanaキーコードがVMに送出されることになる。
このHiragana_katakanaにIMEの切り替えをWindows側で結びつけておけばMac側の状態に関係なく切り替えることが可能になる。
もちろん元の
Use KANA as KANA/EISUU(toggle)
は切っておく