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