WindowsでもMacのKarabiner-Elementsのようにキーバインドを変更したい

ということでAutoHotKeyの紹介なんですが、まずは前置き

まえおき

キーボード

20代の頃は仕事上キーボードは現場で用意されているものを何でも使わないといけなかったのですが、よく使っていたのはNEC EWS-4800、PC9801シリーズ、SunのType-5, Type-6などのキーボードでした。
日本語キーボードもあれば英語キーボードもありましたし、キーマップもわりとそれぞれ違ってたりしましたね。
なかでも、SunのType-5をこよなく愛するプロジェクトリーダーの下で仕事をしたときに英語配列を気に入り、以降は選べるときは英語配列を選ぶようになっていきました。
30代ではHHKBとThinkPad Keyboard、40代から現在にかけてはHHKB Professional2 Type-S(US)を個人でも会社でも両方使うようになっています。

PC-9801

www.google.com

EWS-4800用キーボード

www.abk.nu

Sun Type5 UNIX Keyboard, Type 6 Keyboard

www5f.biglobe.ne.jp

HHKB Professional2 Type-S(US)

www.pfu.fujitsu.com

主な使い方

現在の主な使い方の組み合わせは以下のようになっています。

場所 所有 PC OS Keyboard 注意点
自宅 個人 Macbook Air 2018 OS X BigSur US版 ノートPC
自宅 会社 Mac mini 2018 OS X Catalina HHKB Type-S(US) メイン
自宅 会社 Mac mini 2018 Windows10 HHKB Type-S(US) VirtualBox
自宅 会社 ThinkPad X1 Carbon Gen7 2019 Windows10 US版 ノートPC
会社 会社 ThinkPad X1 Carbon Gen7 2019 Windows10 HHKB Type-S(US) キーボードのみオフィスに置いてる

一番使っている時間が長いのは、Mac miniにつないでいるHHKB Type-S(US)なのですが、ThinkPadにもつなぐ事があるのでWindowsでもそれなりに同じ操作ができないと仕事になりません。
そこでAutoHotKeyの出番というわけです。(やっとか)

WindowsのCapsLockはCtrl2Capを使って入れ替え済みです。

AutoHotKeyで矢印キーを実現する

一番使用頻度が高いHHKB Type-S(US)には、矢印キーがありません。
デフォルトでは Fn + ;/[' なのですが、そんなの使いにくくてしょうがないので自分は Ctrl + hjkl を割り当ててます。
いわゆるvi風ってやつですね。(ちなみにメインのエディタはVimです)

MacだとKarabiner-Elementsという素晴らしいソフトで実現しているのですが、Windowsでいい感じのソフトを探していたらAutoHotKeyというので出来ました。

karabiner-elements.pqrs.org

www.autohotkey.com

Windows + HHKB Type-S(US)を使うときだけでなくThinkPad単体で使うときもうまく行ってます。
ちなみにMac mini上のVMWindowsを使うときはMacキーバインドがそのまま使えるので何もしていません。

レシピ

AutoHotKeyは設定を拡張子ahkのファイルにテキストで記述し、コンパイルしたものを起動時に実行させます。

矢印キーは押しっぱなしになるのでキーリピートの設定を入れてます。

; キーリピートの早いキーボードだと警告が出るので設定
#HotkeyInterval 100

矢印キーの制御を記述します。

; vi like key
^h::Send, {Left}

^j::Send, {Down}

^k::Send, {Up}

^l::Send, {Right}

以下のページからリファレンスを見ることが出来ます。

ahkwiki.net

「ホットキー」と「キーリスト」を見ると定義がわかります。
修飾シンボルとして ^ がCtrlキーとなり、Leftはキーリストから探すと矢印キーの左になりますね。

つまり ^h::Send, {Left}Ctrl+h が来たら 左矢印キー になるということです。
j, k, lも同じように定義します。

Shiftを押しながら選択移動も定義します。

^+h::Send, +{Left}

^+j::Send, +{Down}

^+k::Send, +{Up}

^+l::Send, +{Right}

Shiftの修飾シンボルは + です。
つまり ^+h::Send, +{Left}Ctrl+Shift+h が来たら Shift+左矢印キー になるということです。

その他

Emacs風のもの少し

Emacs風というよりはbashzshの対話シェルのときによく使ってるからという感じでしょうか。
特に Ctrl + aCtrl + e は多用するので設定しています。

^a::Send, {Home}

^+a::Send, +{Home}

^e::Send, {End}

^+e::Send, +{End}

Slackの送信ボタン

Slackを日本語モードにすると Enter が改行になるのはいいんですが、送信がMacだと Cmd + EnterWindowsだと Ctrl + Enter でよく間違えます。
両方同時に使ってると頭のモード切替が間に合わなくてw
よく使うMacに合わせるためにWindowsでは Alt + Enter で送信出来るように設定します。
この設定はSlackのときだけ使えるようしています。

; slack
#IfWinActive, ahk_exe slack.exe
    !Enter::
        Send, ^{Enter}
        return
#IfWinActive

#IfWinActive はWindowタイトルやプロセスを指定してその時だけ動作するように設定できます。
Windowタイトルやプロセスはahkスクリプトを実行したときにタスクトレイのアイコンを右クリックすると、出てくるWindow Spyというツールで調べることが出来ます。

※1行で書くときはreturnが省略できますが、複数行ではreturnを書かないと次に流れていってしまいます。(思わぬ挙動になったりします…)

今後

とりあえず今はこれだけですが、Karabiner-Elementsで出来ているCtrlキーを一回押すとEscになって、長押しはCtrlとして動く、というのも実現したいな。

Karabiner-ElementsはWebでほしい設定をポチポチ押すだけで設定できるので他にも色々設定しているけど、AutoHotKeyは記述しても思ったように動かないことが多くて、デバッグが結構必要になるし、ちょっとづつ増やしてる感じですね。