mac上のVMware仮想Win7キーマップ設定ノート(AutoHotKey)

#mac上のVMware仮想Win7でenthumble風キーマッピング

プライベートPCで「[enthumble](http://jp.enthumble.com/)」を使用してみたら良かったので、仕事環境に導入しようと思ったのですが、フリー版は業務利用NGかつ現場の都合で有料導入が難しかったため、同様のキー操作をAutoHotkeyを使って代替してみました。


環境

- Mac OS X 10.6.8 Snow Leopard
- VMware Fusion 3.1.4
- Windows7 Home SP1(32bit)
- AutoHotkey_1.1.24.04（バイナリ版）

目的

- mac側のキーマッピングは変更しない
- mac上の仮想Win7をApple Keyboard (JIS)で操作
- レジストリに変更を加えない
- IMEのオン/オフの切り替えを楽に
- 「無変換+i」でUpなどのカーソル移動など、その他キー操作のショートカット
- アプリケーションの起動/アクティブ操作ショートカット


## VMware Fusion設定

VMware Fusion>[環境設定]>
[キーボードとマウス]タブ>
[キーマッピング]タブ
 「キーマッピングを有効」オン
 「言語固有のキーマッピングを有効にする」オフ
 キーマップ一覧項目のチェックを全て外す
 [＋]ボタン（項目追加）
  移動元：Command、移動先：Alt
  移動元：Option、移動先：Ctrl
  移動元：Control、移動先：WinKey
  移動元：{英数}、移動先：無変換(Muhenkan)
  移動元：{かな}ひらがな、移動先：変換(Henkan)

※[Mac OS ショートカット]タブのMacショートカットは有効で。
（MacとVMとの行き来に使いたいため）


## IME設定

タスクバーにある言語バー>
設定：テキストサービスと入力言語ウインドウ>
全般タブ：「インストールされているサービス」項目から「Microsoft IME」選択し[プロパティ]ボタン>
「Microsoft IME のプロパティ」ウインドウ[編集操作]タブ、「編集操作」項目キー設定[変更]ボタンクリック>
 「Microsoft IME 詳細プロパティ」ウインドウの一覧から任意のキーの設定を変更する

 無変換,IME-オフ,英数キー,-,-,-,-;
 変換,IME-オン,-,-,-,-;

 変更を加えるとキー設定名が自動で「ユーザー定義」となる
 変更したら[OK]で各ウインドウを閉じる

※キー設定一覧の項目：キー,入力/変換済み文字なし,入力文字なし,変換済み,候補一覧表示中,文節長変更中,変換済み文節入力文字
※設定後、一度再起動した方がいいかも（なんとなく挙動が不安定だった。再起動後は比較的安定した）。


## AutoHotkey設定

ダウンロード：[AutoHotkey Downloads](https://www.autohotkey.com/download/)
※今回はレジストリを変更されたくないため、インストーラ版ではなくバイナリ版を使用

自分用カスタム設定のためメモ帳など適当なエディタで設定ファイルを作成
参考：[AutoHotkeyJp](https://sites.google.com/site/autohotkeyjp/)

※テキストファイルの拡張子を「.ahk」とする。ファイル名は任意でOK

（2017/02/12追記）改善版作りました（[改善版はこちら](#%E6%94%B9%E5%96%84%E7%89%88)）。

```ruby:myScript.ahk
vk1Dsc07B & i:: Send, {Up}
vk1Dsc07B & j:: Send, {Left}
vk1Dsc07B & l:: Send, {Right}
vk1Dsc07B & k:: Send, {Down}
vk1Dsc07B & Space:: Send, {Enter}
vk1Dsc07B & n:: Send, {Backspace}
vk1Dsc07B & vk1Csc079:: Send, {Esc}
vk1Dsc07B::vk1Dsc07B

vk1Dsc07B & q::
Process,Exist,thunderbird.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\Mozilla Thunderbird\thunderbird.exe
return

vk1Dsc07B & a::
Process,Exist,firefox.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\Mozilla Firefox\firefox.exe
return

vk1Dsc07B & s::
Process,Exist,chrome.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\Google\Chrome\Application\chrome.exe
return

vk1Dsc07B & d::
Process,Exist,sublime_text.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\Sublime Text 3\sublime_text.exe
return

vk1Dsc07B & f::
Process,Exist,Dreamweaver.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\Adobe\Adobe Dreamweaver CC 2015\Dreamweaver.exe
return

vk1Dsc07B & g::
Process,Exist,TeraPad.exe
if ErrorLevel<>0
  WinActivate,ahk_pid %ErrorLevel%
else
  Run, C:\Program Files\TeraPad\TeraPad.exe
return

```

作成した設定ファイルを「Ahk2Exe.exe」でコンパイル。
生成された「myScript.exe」を起動すれば設定が反映される。
起動時はタスクバー通知領域にアイコン表示できるので、任意で「アイコンと通知を表示」などに設定すればよい。
常用する場合はスタートアップ項目に登録。

アプリケーション切り替え設定参考：
[「AutoHotkey」をホットキーランチャーとして使う方法](http://usbcafe.blog111.fc2.com/blog-entry-103.html)


## 最後に

当初、キーマップは全てAutoHotkeyで賄うつもりでしたが、「英数」をコンビネーションに利用するとキーが押しっぱなしになってしまったり、日本語環境での使用に不具合があるようでしたので、macとwindowsのキー配列の違いはVMware Fusionのキーマッピングで対応しました。


## 追記

職場で実際に設定してみたところ、VMおよびOSの違いにより若干差異があってハマったのでメモ。

- Mac OSX El Capitan
- VMWare Fusion 8.5

VMWare Fusion のキーマッピングの設定は、環境設定メニューからではなく、仮想マシンメニューの設定から行わないと、プロファイル選択が有効にならなかった。
また、仮想マシンを起動した状態のままキーマッピング設定しようとすると、キー選択するためのプルダウンが空白となり、キーを選択できないので、設定の際は停止するよう注意。


## 改善版

改善版を作りました。

- 変換キー＋ijlkにもカーソル割り当てで片手で移動できるように
- shift＋カーソル割り当てで選択移動できるように
- エクスプローラウインドウの起動・アクティブ化にホットキー設定（『[QTTabBar](http://qttabbar.sourceforge.net/)』を導入してるのでウインドウ一つの運用）
- アプリケーションランチャー改善


```ruby:myScript.ahk
; AutoHotKey
; myScript.ahk
; 2017/02/11


; ---- henkan combination ----

vk1Csc079 & i::
  If GetKeyState("shift", "P"){
    Send, +{Up}
  }else{
    Send,{Up}
  }
  return
vk1Csc079 & j::
  if GetKeyState("shift", "P"){
    Send, +{Left}
  }else{
    Send,{Left}
  }
  return
vk1Csc079 & l::
  If GetKeyState("shift", "P"){
    Send, +{Right}
  }else{
      Send,{Right}
  }
  return
vk1Csc079 & k::
  if GetKeyState("shift", "P"){
    Send, +{Down}
  }else{
    Send,{Down}
  }
  return
vk1Csc079 & n:: Send, {Backspace}


; ---- muhenkan combination ----

vk1Dsc07B & i::
  If GetKeyState("shift", "P"){
    Send, +{Up}
  }else{
    Send,{Up}
  }
  return
vk1Dsc07B & j::
  if GetKeyState("shift", "P"){
    Send, +{Left}
  }else{
    Send,{Left}
  }
  return
vk1Dsc07B & l::
  If GetKeyState("shift", "P"){
    Send, +{Right}
  }else{
      Send,{Right}
  }
  return
vk1Dsc07B & k::
  if GetKeyState("shift", "P"){
    Send, +{Down}
  }else{
    Send,{Down}
  }
  return
vk1Dsc07B & Space:: Send, {Enter}
vk1Dsc07B & n:: Send, {Backspace}
vk1Dsc07B & vk1Csc079:: Send, {Esc}
vk1Dsc07B & Tab:: Send, ^+{Tab}



; ---- launcher / active window switcher ----

; explorer
vk1Dsc07B & z::
  IfWinNotExist, ahk_id %exp_1%
  {
    Run, explorer C:\
    sleep 1000
    WinGet, exp_1, ID, A
    return
  }
  IfWinActive, ahk_id %exp_1%
    send, #{down}
  else
    WinActivate
  return

; application launch func
executeOrFocus(folderPath, fileName, option = ""){
  Process, Exist, %fileName%
  if (ErrorLevel <> 0) {
    WinActivate, ahk_pid %ErrorLevel%
  } else {
    path := folderPath . fileName . option
    path := RegExReplace(path, "~", HOME)
    Run, %path%, '', MAX
  }
}

vk1Dsc07B & x::executeOrFocus("C:\Program Files\TeraPad\","TeraPad.exe","")
vk1Dsc07B & c::executeOrFocus("C:\Program Files\Sublime Text 3\","sublime_text.exe","")
vk1Dsc07B & v::executeOrFocus("C:\Windows\system32\","calc.exe","")

vk1Dsc07B & a::executeOrFocus("C:\Program Files\Mozilla Firefox\","firefox.exe","")
vk1Dsc07B & s::executeOrFocus("C:\Program Files\Microsoft Office\Office12\","EXCEL.EXE","")
vk1Dsc07B & d::executeOrFocus("C:\Program Files\Microsoft Office\Office12\","WINWORD.EXE","")
;vk1Dsc07B & f::executeOrFocus("C:\Program Files\Adobe\Adobe Dreamweaver CC 2015\","Dreamweaver.exe","")
;vk1Dsc07B & g::executeOrFocus("C:\Program Files\Adobe\Adobe Photoshop CC 2015 (32 Bit)\","Photoshop.exe","")

vk1Dsc07B & q::executeOrFocus("C:\Program Files\Mozilla Thunderbird\","thunderbird.exe","")
;vk1Dsc07B & w::executeOrFocus("","mattermost","")
;vk1Dsc07B & e::executeOrFocus("","jitsi","")


; ---- defect measures ----
vk1Csc079::vk1Csc079
vk1Dsc07B::vk1Dsc07B
```

※上では一部アプリケーション割り当てはコメントアウトで保留にしてます。各アプリケーションのパスは各自環境に合せてください。
なぜかコメントアウトに「/\*\*/」を使用すると動作しなかったので、「;」だけを使用。


### 参考

こちらのコードを使わせていただきました。

- [AutoHotkeyのスクリプトを編集した](http://cd01.hatenablog.jp/entry/2012/10/08/012109)
- [AutoHotkey Community:forrum - Help for Newbie on activating explorer windows](https://autohotkey.com/board/topic/73595-help-for-newbie-on-activating-explorer-windows/)

ありがとうございました。