AutoHotKey はいろいろなキーボードの動作を変更できて非常に便利なツールです。
普段使っているのは、キーアサインの再定義なのですが、一点問題が…
特殊キー+SHIFT+(何かのキー)
が定義できません。
■無変換+(何かのキー)
たとえば、無変換+N キーで、DEL キーの代わりをさせたとします。
キー定義はこんなふうになります。
vk1Dsc07B & n:: Send, {Blind}{Del} ; DEL
これ自体は問題なく動きますが、せっかくなので、「SHIFT キーが同時の押されていたら "行末まで削除" にしたい」と思っても、
vk1Dsc07B & +n::
の定義は受け付けてくれません(+は SHIFT の修飾子)。
■3キーのコンビネーション
結局やりたいことは2つのキーのコンビネーションではなく、3つのキーのコンビネーションなわけです。
で、このときの対策は、実行プログラム中でこれを判断してやればできるようになります。
私が実装しているのは
無変換 +n :DEL(1文字後方削除)
無変換 +m :BS(1文字前方削除)
無変換+SHIFT+n :行末まで削除
無変換+SHIFT+m :行頭まで削除
です。
実際のコーディングは以下のようになります。
◇――――――――――――――――――――――――――
vk1Dsc07B & m:: ; 行末まで削除(改行記号除く)
GetKeyState, sss, Shift
if sss = D
{
Send, {Blind}+{End} ; 行末まで
Send, {Blind}+{Left} ; 改行記号除く[*1]
Send, {Blind}{DEL} ; 行末まで削除(改行記号除く)
}
else
Send, {Blind}{Del} ; DEL
return
vk1Dsc07B & n::
GetKeyState, sss, Shift
if sss = D
Send, {Blind}+{Home}{DEL} ; 行頭まで削除
else
Send, {Blind}{BS} ; BS
return
――――――――――――――――――――――――――◇
まあ、なにをやっているかは、無変換+キー が押されたら、その中で SHIFT キーが押されているかどうかを判断して、動作を変えているだけです。
[*1] 部分で1文字左側に戻しているのは、多くの編集画面では、SHIFT+END とやると改行まで選択されてしまうので、そのまま削除を実行すると、次の行と連結しちゃうからです。
もし、改行まで選択されないようなアプリがあれば、そのアプリを WinGetTitle で除外してやります。
私愛用の Sakura エディタがそうなので、
◇――――――――――――――――――――――――――
vk1Dsc07B & m:: ; 行末まで削除(改行記号除く)
GetKeyState, sss, Shift
if sss = D
{
Send, {Blind}+{End} ; 行末まで
WinGetTitle, ttt, A
if InStr(ttt, "- sakura") = 0
Send, {Blind}+{Left} ; 改行記号除く
Send, {Blind}{DEL} ; 行末まで削除(改行記号除く)
}
else
Send, {Blind}{Del} ; DEL
return
――――――――――――――――――――――――――◇
実体はこんなふうにして使ってます。
アプリ側で、「SHIFT+DEL で行末まで削除」みたいに設定できるものは、何も考えなくてもいいですけどね。
もう少しスマートにできるといいのですけど…。
◆このテーマのおすすめ図書
10年後の仕事図鑑
「仕事ができるやつ」になる最短の道
仕事が速いのにミスしない人は、何をしているのか?
自分の仕事をつくる
アイデアのつくり方を「仕組み化」する