[AHK]sendで複数Enterが送れない。

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倍ましです。一先ず、便利に使えるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です