備忘録とか日常とか

学んだこととかを書きます。

キーバインドをカスタムして全能感を手に入れる【AutoHotKey, ChangeKey】

「こいつらExcel好きすきだろ・・・」と思いながら日々仕事してます。

業務時間の大部分をExcelに費やしているわけが、

  • カーソル移動が煩わしい
  • よく使うショートカットが押しにくい

という問題があったため、改善してみた。
多くの操作をキーボードで完結させることができると、クソつまんない仕事のモチベーションも多少は上がる、と思いたい。

ここでは二つのツールを使用する。

レジストリレベルで設定する「Change Key」

forest.watch.impress.co.jp

レジストリを編集してキーバインドを変えられる。非常駐なのでリソース圧迫しない。
windows7対応となっているが、2019/4/21現在でwindows10でも使用できているので問題はない。
ただし念の為レジストリのバックアップはとっておいたほうがよいかも。

www.ask-mswin.com

ChangeKeyでは特定のキーを他のキーに割り当てられる。
管理者権限でChgKey.exeを実行すると、以下のような画面が表示される。

f:id:may46onez:20190421001453p:plain:w650

ここから変更したいキーを選択し、次の画面でどのキーに変更するかを選択する。

f:id:may46onez:20190421001603p:plain:w650

自分の場合は以下のように設定している。

  • CapsLock -> 左Ctrl
  • 半角・全角 -> Esc
  • Insert -> 右windows

CapsLockはほぼ必須、というか誤爆しやすい人は使わなくても変えておくと捗ると思う。
Esc多用するときは若干遠いので、半角全角キーを変更している。IMEオンオフはCtrl+Spaceで。
Insertはまあなくてもいいけど、右手でwindowsキー押せたらうれしい場面がたまにあるので。(キーボードに右windowsがない)

AutoHotKey」で理想のキーマップを手に入れる

autohotkey.com

ご存知キーボードリマップツール。実はマウスコマンドも設定できるらしい。可能性は無限大。
こちらは常駐型となるが、それでも余りあるメリットを享受できる。
インストール後に.ahkという拡張子で書かれたスクリプトを実行することで、
設定したキーマップを使用できるようになる。

自分の要望としては、
1. ホームポジションから動かずにカーソル移動したい
2. ファンクションキー遠いのでなんとかしたい
3. ホームポジションを崩す必要があるショートカットを変更したい
という要求をまず満たしたい。

方法としては、変換・無変換のキーと同時押しを割り当てることで各種機能を実現する。
そのため変換・無変換キーを他の用途に使うことはできなくなるが、
まあ普通の人ならほぼ使わないと思う。
自分は以前の記事でこれら二つのキーにIMEオン・オフを割り当てていたので、そこを根性で矯正した。

変換・無変換は本来の機能で使わなくなるので、IMEの設定で切っておくことをお勧めする。
f:id:may46onez:20190421003954p:plain:w650

以下に自分のスクリプトを貼っておく

; ウィンドウを閉じる
!q::Send, !{F4}

; Chrome等、進む・戻る用設定
vk1D & ,::Send, !{Left}
vk1D & .::Send, !{Right}

; ウィンドウ移動
vk1C & Tab::Send, #+{Right}
; ウィンドウ操作
vk1C & i::Send, #{Up}           ; 最大化
vk1C & j::Send, #{Left}         ; 左寄せ
vk1C & l::Send, #{Right}        ; 右寄せ
vk1C & k::Send, #{Down}         ; 最小化

; 仮想デスクトップ切り替え
vk1C & f::Send, #^{Right}
vk1C & d::Send, #^{Left}

;無変換+jkil = 上下左右
;無変換+shift+上下左右 = shift+上下左右

;無変換+j→左
vk1D & j::
    if GetKeyState("shift", "P") && GetKeyState("ctrl", "P"){
        Send, +^{Left}
    }else if GetKeyState("shift", "P"){
        Send, +{Left}
    }else if GetKeyState("ctrl", "P"){
        Send, ^{Left}
    }else{
        Send, {Left}
    }
    return
;無変換+k→下
vk1D & i::
    if GetKeyState("shift", "P") && GetKeyState("ctrl", "P"){
        Send, +^{Up}
    }else if GetKeyState("shift", "P"){
        Send, +{Up}
    }else if GetKeyState("ctrl", "P"){
        Send, ^{Up}
    }else{
        Send, {Up}
    }
    return
;無変換+i→上
vk1D & k::
    if GetKeyState("shift", "P") && GetKeyState("ctrl", "P"){
        Send, +^{Down}
    }else if GetKeyState("shift", "P"){
        Send, +{Down}
    }else if GetKeyState("ctrl", "P"){
        Send, ^{Down}
    }else{
        Send, {Down}
    }
    return
;無変換+l→右
vk1D & l::
    if GetKeyState("shift", "P") && GetKeyState("ctrl", "P"){
        Send, +^{Right}
    }else if GetKeyState("shift", "P"){
        Send, +{Right}
    }else if GetKeyState("ctrl", "P"){
        Send, ^{Right}
    }else{
        Send, {Right}
    }
    return

; PageUp
vk1D & u::
    if GetKeyState("ctrl", "P"){
        Send,^{PgUp}
    }else{
        Send,{PgUp}
    }
    return

; PageDown
vk1D & o::
    if GetKeyState("ctrl", "P"){
        Send,^{PgDn}
    }else{
        Send,{PgDn}
    }
    return

; ファンクションキー置き換え
vk1C & 1::Send, {F1}
vk1C & 2::Send, {F2}
vk1C & 3::Send, {F3}
vk1C & 4::Send, {F4}
vk1C & 5::Send, {F5}
vk1C & 6::Send, {F6}
vk1C & 7::Send, {F7}
vk1C & 8::Send, {F8}
vk1C & 9::Send, {F9}
vk1C & 0::Send, {F10}
vk1C & -::Send, {F11}
vk1C & ^::Send, {F12}

; 右クリック
vk1D & 0::Send, +{F10}


ホットキー設定するだけなら単純で、::の左に登録したいキー組み合わせ、右にSend, と送信したいキーを書く。shift, ctrl, alt, windowsキーはそれぞれ修飾キーと呼ばれ、+^!#で表現する。二行目はalt + qalt + F4に置き換えている。vk1Cvk1Dはそれぞれ変換と無変換のキーを表す。


少々面倒だが、登録したホットキーと別のキーの同時押しは対応できないため、すべて登録しておく必要がある。上の例でいえば無変換+jキーで矢印左が入力できるが、shiftを押しながらの範囲選択はできない。なので::の後に場合分けを入れ、矢印キーと同時に修飾キーが押された場合をすべてホットキーとして登録している。


詳しい使用方法はwikiに書かれている。正直機能が多すぎて扱いきれる気がしない。
AutoHotkey Wiki
wikiのキーリストに各キーをスクリプト上でどう表現するかが書かれているが、少し内容が古いのでそこだけは注意。vkXXscYYみたいなキーはscYYを除いた部分を表記すれば動く。(Invalid HotKey みたいなエラーが出る)
詳細は下の記事を参照
qiita.com


自分好みのスクリプトが作れたらスタートアップに登録しておくとよい。
windowsキー+r で出る窓にshell:startupと入力し、出てくる場所に.ahkを置くだけで起動時にホットキーが有効になる。

後日談

これはこれで満足しているが、変換・無変換を多用するので使うキーボードが若干限られるという問題に直面した。スペースキーが長いものだと親指がちょっとしんどい。
realforceの新しいやつが欲しかったのにスペースキーが伸びてて悲しい・・・