Windows 8.1にHHKB Professional 2を接続してMac的に使えるようにカスタマイズする

今まで Mac に HHKB Professional 2 を接続して大満足だったのを、Windows 8.1 につなぎ替えることになった。コマンドキー不在やらWinキーやらでさんざん試行錯誤した挙句、以下のような方針でカスタマイズを行った。

- Mac でコマンドキーとして使っていた HHKB [左コマンドキー] に Windows の `左Ctrl` を割り当てる。
- Mac でコントロールキーとして使用していた HHKB [Controlキー] は、矢印キーや Home/End のモディファイヤキーに転用する。
    - そのために、HHKB [Controlキー] に Windows の `無変換` キーを割り当て、これを擬似 control キーとして emacs/vim 的なキーバインドを与える。
- Mac でほとんど使っていなかった HHKB [右コマンドキー] を、Windows のマウス右クリックに転用する。
    - そのために、HHKB [右コマンドキー] に Windows の`変換`キーを割り当て、さらに `Shift + F10` に置き換える。
- Mac でほとんど使っていなかった HHKB [右オプションキー] に、Windows の `Win` キーを割り当てる。

この記事では[]で囲まれているのが物理キー、\`\`で囲んだものが論理キーを表すことにする。

MacではCtrlキーとコマンドキーが両方使えるので、特にemacsやvimなどのunix系アプリとキーがぶつからず大変便利だったのだけど、WindowsはCtrlキーだけで賄わないといけないため、emacs/vimなどのカーソル移動系がのきなみ潰されてしまっている。これはあまりに残念なので、自分で勝手にモディファイアキーをこしらえてHHKBの[Controlキー]に割り当て、これでカーソル移動を賄うことにした。WordやExcelのみならずすべてのアプリケーションでこの移動キーを使えるようにしたいと思った挙句の所業でした。

# ステップ 1: HHKB Professional 2 の設定

HHKB Professional 2 のディップスイッチを以下のように設定した。SW1と2は LiteksはLite拡張モードをオンにしてWinキーを有効にする設定。4-6は不要なので変更しなかった。
- SW1: 上 (オン) 
- SW2: 下 (オフ)
- SW3: 上 (オン) -- DeleteキーにBackSpaceを割り当てる
- SW4: 下 (オフ) 
- SW5: 下 (オフ)
- SW6: 上 (オン)

HHKBをWin 8.1に接続して認識させ、英語キーボードとして動作することを確認。

# ステップ 2: KeySwapでキー割り当てを変更

続いて、`Win`キーと`変換`、`無変換`キーを HHKB で無理やり使うために[KeySwap](http://mottobenrini.blog70.fc2.com/blog-entry-25.html)というソフトでキー割り当てを変更した。キー割り当てを変えられるなら別に何でもよい。かっこ内はキーコード。

注意しなければならないのは、キーボード種別を[英語]にして設定した点。HHKBは英語キー配列なのでそうするしかない。

- 左Winキー (実は[左コマンドキー]) -> 左Ctrlキー (1D)
- 右Winキー (実は[右コマンドキー]) -> 変換キー (<79> (79)) -- 後でマウス右クリックを割り当てる
- 左Ctrlキー ([左Ctrlキー]) -> 無変換キー (<7B> (7B)) -- 後でオレオレモディファイアキーにする
- 右Altキー ([右Altキー]) -> 右Winキー (DC)

Winキーがまったくないのもさみしそうだったので、右Altに割り当ててみた。

# ステップ 3: AutoHotKeyのキーマクロでキーをカスタマイズ

ここまでできればいよいよキーマクロを導入。今回は[AutoHotKey](http://ahkwiki.net/Top)というソフトを使用した。キーマクロを構成できるなら何でもいい。以下はそのスクリプト。

```
;emacs & vimハイブリッドの移動キーを構成
vkEBsc07B & a:: Send, {Blind}{Home}
vkEBsc07B & e:: Send, {Blind}{End}
vkEBsc07B & d:: Send, {Blind}{del}
vkEBsc07B & b:: Send, {Blind}{left}
vkEBsc07B & f:: Send, {Blind}{right}
vkEBsc07B & p:: Send, {Blind}{up}
vkEBsc07B & n:: Send, {Blind}{down}
vkEBsc07B & h:: Send, {Blind}{left}
vkEBsc07B & l:: Send, {Blind}{right}
vkEBsc07B & k:: Send, {Blind}{up}
vkEBsc07B & j:: Send, {Blind}{down}

;保存
vkEBsc07B & s:: Send, ^{s}

;終了
vkEBsc07B & q::WinClose, A
^q::WinClose, A

;仮名漢字変換
^Space:: Send, !{vkC0sc029}

;右クリック
vkFFsc079 :: Send, +{F10}
```

これでHHKBの[Ctrl]キーがオレオレモディファイアキーとして機能するようになった。見る人が見たら、emacsとvimのハイブリッドは相当キモいと思うけど、自分にはこれが使いやすい。vimを使っていてもemacsの`ctrl+a`と`ctrl-e`だけは使いたいクチなので。

以前はVBマクロでemacsキーバインドをエミュレートしてたりしたけど、今回はキーボードレベルで設定したのでExcelやWordだけにとどまらずあらゆるアプリで`オレ+なんちゃら`でカーソル移動ができるのがありがたい。

WindowsにはMacの`コマンド+q`のようなグローバルな終了コマンドがないので、`Ctrl+q`と`オレ+q`にそれぞれ`Alt+F4`を割り当てた。これでMacと同じ感覚でアプリを終了できるようになった。

なお仮名漢字変換の切り替えは Google IME用にした。

ひとつはまったのが、[Shift]キーを押して選択範囲の拡大/縮小を行う方法がなかなかわからなかったこと。Shift選択がキーボードでできないとオレオレ設定のありがたみが半減してしまう。最終的に、AutoHotkeyで、[Shift]キーと組み合わせる可能性のあるキーに`{blind}`を追加することで[Shift]キーが認識されるようになり、無事解決。

# その他

- ランチャーはAlfredにしたかったけどしかたがないので[Executor](http://enjoypclife.net/2014/11/22/windows-mac-quicksilver-alfred-launcher-executor/)にした。
- カーソルの動きが遅すぎるのでレジストリをいじってスピードアップした。同じようなリソースがいくつもあってどれが本物かわからなかったので全部に設定した。

# 追記

昨日何かのはずみで AutoHotKey の設定ファイルがぶっとんでしまったが、この記事に残しておいた設定で無事復旧できた。情けは人のためならず。