AutoHotkeyに下記の様なコードを書いて実行してみた。
^+b::send,{enter}a
普通にEnter押された後aが出るだけだと思ったのだが、aが表示されない。
最初はAHKが悪いんだと思ったら、使っていた秀丸エディタでのみこの事象が発生していた。
もちろんながら、秀丸エディタに対して手動でEnterキーを打った後、aキーを押せば、改行してからaという文字が表示される。
他のSendならダメかとも思ったんだけど、全部だめだった。
^+d::
SendRaw, SendRaw`na ;NG
return
^+e::
SendInput, SendInput{enter}a ;NG
return
^+f::
SendPlay, SendPlay{enter}a ;NG
return
^+g::
SendEvent, SendEvent{enter}a ;NG
return
唯一、clipboardにコピーしてから^vで貼り付ける方法なら、改行も含めて、出来たんだけど、秀丸で書いてたインデントの量が反映されないから今一つ。。。
原因と対策
秀丸が改行に対して何か処理してるみたいで、その時間がそこそこ掛かってるみたい。
^+h::
send,{enter}
sleep,40
send,b
return
上記のようにsleep噛ましたら、正しく入力されるようになった。
Inputコマンドでif、for、whileのテンプレート入力しようとしただけなのに地味に手間かかった。。。
多分、VisualStudioとか他のコードエディターでも、sleepしないとうまくいかないかもしれない。
インデントを付けてコードを貼り付け
元々は、そのままEnterしようとしてたんですが、いちいちSleep付けるのもめんどくさかったので、コード整形して貼り付ける関数を作ってみました。
PasteWithIndent(str){
;現在地のインデントを取得
send,+{Home}
send,^c
send,{End}
;渡された文字列にインデントを追加
Clipboard:= RegExReplace(str,"\n", "`n" Clipboard, nHit)
send,^v
cmd:="{Up " nHit-1 "}"
send, %cmd%
send,{End}
}
^+a::
str:="
(
if(){
`t
}
else if(){
`t
}
else(){
`t
}
)"
PasteWithIndent(str)
return
これで、任意の文字列をインデント付きでペーストできるようになりました。
このコードだと、if文を入れたい場所にカーソルを持って行って、Ctrl+Shift+aを押すと、現在の位置のインデント量を付加されて、挿入されます。このように書くと、複数行の文字列がまとめて変数に代入できるのですが、Tabだけの行はTabが削除されて認識されるみたいです。Enterはそのままでいけますが、tabは`tに書き換えないといけないのが若干面倒ですね。
まあ、ちまちまsleepするのに比べれば100倍ましです。一先ず、便利に使えるようになりました。


コメント