はじめに
本エントリは高知工科大 Advent Calendar 2018の4日目の記事です。
皆さんも普段生活している中で「あー、ホームポジションのままカーソル移動ができたらなー」と思うことは多いと思う。思わない?僕は思う。
このエントリでは、左手のCtrlと、右手の「I」「J」「K」「L」キーの組み合わせで、移動キー(Up, Left, Down, Right)と同じ振る舞いができるようにする。
使用ツールはAutoHotkey。
「USキーボードでも」というのは、JISキーボードでCtrlではなく無変換キーを利用したものなら既に結構記事があることからきている。USには無変換キーは無いからどうなることか...。
環境
- Windows 10 Home x64
- USキーボード (ctrl2capでCapsLockをCtrlにしてある)
AHKスクリプトを書く
試行錯誤1 シンプル
^i::Send,{Up}
^j::Send,{Left}
^k::Send,{Down}
^l::Send,{Right}
移動キーは問題なく発行される。
Shiftを組み合わせると、移動キーは無効化され、その環境のショートカットが発行される。
試行錯誤2 Shiftに対応したい
^i::Send,{Blind}{Up}
^j::Send,{Blind}{Left}
^k::Send,{Blind}{Down}
^l::Send,{Blind}{Right}
Shift同時押しを受け付けさせるために{Blind}を入れたが、CtrlならShift+Ctrl+i+Upになってしまい、期待通りの振る舞いをしない。
試行錯誤3 GetKeyState
^i::
if GetKeyState("shift","P"){
Send,+{Up}
}else{
Send,{Up}
}
return
^j::
if GetKeyState("shift","P"){
Send,+{Left}
}else{
Send,{Left}
}
return
^k::
if GetKeyState("shift","P"){
Send,+{Down}
}else{
Send,{Down}
}
return
^l::
if GetKeyState("shift","P"){
Send,+{Right}
}else{
Send,{Right}
}
return
AutoHotKeyで簡単にカーソル移動、範囲選択:カタカタめも、Windowsのキー配置を入れ替えて作業効率化 | たまに、更新するかもしれないブログを丸パクリ参考に。
試行錯誤2とは違い、移動は出来ず、Shift+Ctrl+k(行削除)が発行される。ホットキーを全く乗っ取れていない。
試行錯誤4 無職修飾キー
LWin::Send, {vk88 Down}
試行錯誤3
参考ブログが無変換キー利用でできてるということは、USキーボードに無変換キーをつくればいけるんでは?という発想。無理でした。
キーを乗っ取ってそれを修飾キーにすることができない理由
ホットキー - AutoHotKeyJpのコンビネーションキーの説明から。
コンビネーションキー
&を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能。
一つ目に指定したキーが修飾キーとなり、一つ目のキーを押しながら二つ目のキーを押すと発動する。
一つ目のキーを押して、ホットキーを発動させずに離すと、一つ目のキー単独に割り当てられたサブルーチンが実行される。
一つ目のキー自体のもともとの機能は無効化される。
結論
要件達成ならず。
おわりに
できたことよりも、できないことを確認したというエントリということでひとつ。
レジストリをいじってUSキーボードに無変換キーなりの無職修飾キーを作って、Ctrlではなくそれを利用すればいけそうだが、それをするならAHK使わず全部レジストリで実現すればいいじょのいこと言う話で…。
現在は試行錯誤1にHome、End、Backspace、DeleteをそれぞれU、O、N、Mに割り当てを追加して使っている。範囲選択のときは本物の移動キーを使うことになってしまうが、まあ便利。
レジストリいじってうまくいったら第2話ということでまた投稿する。できたらいいな。