AutoHotKeyはただのキーボードカスタマイズソフトウェアではなく、スクリプト言語です。そのためユーザーが自分で変数や関数を定義することもできます。
今回はAutoHotKeyで変数や簡単な処理をする関数を定義し、その関数をホットキーによって走らせてみましょう。
文字列を出力するときに起こる問題
単純に文字列を出力するホットキーを設定するような場合、こんな感じのコードが思い浮かぶかもしれません。
F13::Send,console.log();
F13キーを押したときにJavaScriptのconsole.log()という文字列を出力するコードですが、ここで問題になるのはIMEの状態が考慮されていないということです。
このコマンドではconsolo.log()というキーを叩く動作が出力されるだけです。そのためIMEがONの状態でF13を押してしまうと、こんな文字が出力されてしまいます。
「混んそぇ。ぉg();」
IMEの状態に関わらず同じ出力を得たいということであればクリップボードを経由して文字を貼り付けるのが安全です。以下では変数を利用して、この機能を実装してみたいと思います。
変数の代入/呼び出し構文
変数への代入構文はAutoHotKeyでは何種類か存在します。
a = "test" ;文字列"test"を""込みで変数aに代入
a = test ;文字列testを変数aに代入
a := "test" ;同上。""は含まない
a = %test% ;変数testの中身の値を変数aに代入
a := test ;同上
少々ややこしいですが、基本的にAutoHotKeyで変数に値を代入するのであれば、
変数名 :="文字列"
のように、文字列を代入する場合はダブルクオート""で囲む- 数値や変数の場合は
変数名 := 123
や変数名 := 変数名
とそのまま表記する
以上の方法に統一してしまうのが、他のプログラミング言語と近い文法になるので良いかと思います。
また変数の内容を呼び出すには、
MsgBox, %a%
と「%」で変数名を囲んで呼び出しましょう。そうするとこれは「aという変数を展開して、その中身をダイアログの文字として出力する」という命令になります。「a」だけだと、ただの文字列aにしかなりません。
クリップボードのバックアップ
変数の構文を踏まえた上で、現在のクリップボードの全内容を別の変数にバックアップしましょう。
処理が始まる直前までのクリップボードの内容を全て退避させておくことで、それまでのクリップボードの内容が上書きされてしまわないよう守ります。
組み込み変数ClipboardAllはクリップボードの全内容が代入された組み込み変数(AutoHotKeyに標準で用意されている変数)です。これを新たな変数「backup」に代入します。
backup := ClipboardAll
次に出力したい文字列を組み込み変数Clipboardに代入します。これは「最新のクリップボードの内容」が入る変数です。
Clipboard := "console.log();"
クリップボードに代入されたテキストをCtrl+Vでペーストします。
Send,^v
処理を一時停止する – sleep
ここでペースト処理が確実に終了してから次のコードに進むよう、多少待ち時間を挟みましょう。sleepコマンドを利用すると「sleep,〇〇(ミリ秒)」で指定時間の間、処理を停止します。
sleep,100
ペースト処理が終了するのを見計らって、バックアップしておいた元のクリップボードの内容をクリップボードに戻します。
Clipboard := backup
次にすぐ入力に移れるよう、console.log()の()の中にカーソルを移動します。←(左矢印)を2回入力。
Send,{Left 2}
ここまでの処理をまとめるとこうなります。複数行の処理では終わりにreturnを記述しましょう。
F13::
backup := ClipboardAll
Clipboard := "console.log();"
Send,^v
sleep,100
Clipboard := backup
Send,{Left 2}
return
一連の処理を関数として定義する
これでIMEのON/OFFに関わらず半角の文字を出力するスクリプトが書けましたが、同じようなホットキーを何個も作るとなるとこの全てをコピペしなければならず、面倒で何よりメンテナンス性、可読性も下がります。
そこでここまでの処理を関数として定義し、ホットキーからは定義した関数を呼び出すという方がスマートな運用です。以下では一連の処理を関数としてまとめていこうと思います。
関数定義構文
AutoHotKeyの関数定義の基本はこのような形で、ほぼ他のプログラミング言語と違いはありません。
関数名(引数 無い場合も有り 初期値は=以降に記述){
処理内容
Return 戻り値(無い場合も有り)
}
先ほど作ったconsole.log()を出力するコードをここに当てはめるとこうなります。
getString(str){ ;getStringという名前の関数(呼び出し時に引数を1つ受け取る)
backup := ClipboardAll
Clipboard := str ;受け取った引数をクリップボードに代入
Send,^v
sleep,100
Clipboard := backup
Send,{Left 2} ;戻り値が不要であればReturnは不要
}
これでgetString(str)という関数が出来上がりました。これをF13キーで呼び出しましょう。
F13::getString("console.log();")
「F13キーを押すとgetStringという関数をconsole.log();という引数を渡して呼び出す」という意味になります。
関数を使ってホットキーを量産する
ここまでで簡単な関数を定義しましたが、1つのホットキーで使用するだけの関数であればあまり意味はありません。
関数を定義しておく利点は呼び出し方を変えれば処理自体は使い回せるということです。
例えばこの関数を使って、F14キーにはPHPのvar_dump();を出力させてみましょう。簡単です。関数を使えば1行で済みます。
F14::getString("var_dump();")
こんな風に関数に渡す引数を変えるだけで、同じような操作であれば簡単にホットキーを量産できるというのが関数定義のメリットです。