但し書き
完全なオレオレ環境です。
クリップボード周りでトチっていそうだったら、Sleepを片っ端から100とか200とかにしてみると改善するかも。
やっていること
「選択した文字列をクリップボードにコピーし、その前後を引数で挟んで返す」関数を用意した。
クリップボードへの登録はCtrl+Cで行う。
Ctrl+C後にクリップボードが0文字だったら(=無選択だったら)単に引数を返してカーソルをひとつ前に送る。
また、Ctrl+C後にクリップボード内に改行が入っていたら、無選択と同様の処理を行う。
WrapBracket(x,y){
Backup := ClipboardAll
Clipboard =
Send, ^c
Sleep,50
IfInString, Clipboard, `r`n
{
Clipboard =
ClipStatus := 0 ;からっぽのカッコが送られるので0
}Else if (Clipboard = ""){
ClipStatus := 0
}else{
ClipStatus := 1 ;中身があるので1
#if
}
; StringReplace, Clipboard, Clipboard, `r`n, , All
Sleep,50
Clipboard = %x%%Clipboard%%y%
Sleep, 50
Send,^v
Sleep,50
if (ClipStatus = 0){
send,{Left}
}Else{
#If
}
Clipboard := Backup
ClipStatus =
}
呼び出しはこうする。
sc07B & k::
WrapBracket("「","」")
Return
どうしてこんな処理をしているの?
AutoHotkeyの欠点のひとつとして、クリップボード周りの処理が遅い・不確実というのがある。
選択範囲を取得するのにクリップボードが不可欠だが、そのクリップボードを編集するためにリソースを食うのだ。
また、AutoHotkeyは日本語IMEをうまく扱えない。
IMEがONの状態で関数を発動させた場合、直接送り出した文字列は「日本語IMEをONにした状態で入力した」ものとなる。
OutputContents = autoHotkey
sc07B & w::
Send,%OutputContents%
Return
この状態の時、出力結果はこのようになる。
IME OFF | IME ON |
---|---|
autoHotkey | あうとHotkey |
AutoHotkeyにおける文字列出力は、究極的にはプログラムくんがキーボードを叩いているだけのことだ。
IMEをONにした状態で叩かせれば、当然日本語が入力される。
ホットキーを入力した際にIMEをOFFにするという発想もある。
実際、それを実現してくれる関数も公開されている。
関数の機能を適切に用いれば、ホットキー処理終了後にIMEの状態を復元することも可能だ。
だが、結局はクリップボードの処理速度がボトルネックになる。
前にコピーした文字列がテキストファイルひとつ分だったとしたら、それがひたすらに垂れ流され続ける(実話)。
それがSkypeのチャットだったりして、クリップボードに改行が入ってなどいたりした日には(実話)。
あまつさえチャットの設定を「Enterキーで送信」などにしていた日には(実話)!
目も当てられない。
だから、速度を妥協してでも変数を触るという処理にしているのだ。
また、環境によってはIMEの状態を復元する処理がAutoHotkeyによる入力途中に発生する危険性がある。
文字列をそのまま送信しているだけなので、入力した文字列がそのまま変換候補に出てくるだけだ。
しかし、これを他の機能や入力と連携させるとなると……。
誰か、いい方法を教えて(懇願)
今後の展望
この記事は「括弧自動入力編」である。
当然、後方にはいろいろな記事が控えている。
電話番号や日付のフォーマット別自動入力だとか、Windowsの機能と絡めた『ボスが来た』機能実装のアレコレだとか。
我ながらニッチだと思うのは、小文字←→大文字変換スキームだ。
AutoHotkeyはなかなか便利な機能があるので飽きない。
興味が湧いたという物好きな人はここからAutoHotkeyを落としてインストールしよう。
共に世界の支配構造を打ち砕こうではないか。