AutoHotkeyの基本的な使い方についてと、 自分が詰まったところについてのメモ。
変数、関数、ウィンドウ毎の設定などについて。
変数
yamyやMacのKeyRemap4MacBook
等と大きく違うのが変数を使えることだと思います。
変数に文字列を収納することで、1つの変数で複数のモード
を
作れるので管理が簡単になります。
この変数の初期設定について少し注意が必要で、
Auto-execute section
と呼ばれる領域でしか
初期値設定できません。
この領域は設定ファイルの先頭から始まり、
Return
やキー設定などが出るまでの領域になります
1。
変数には型はなく、数式などでは数値である場合はその時に
数値として解釈されます。
前回書いたように、
変数でも、変数自体の大文字小文字は区別されません。
(a
という変数を作った場合にA
でも参照できます。)
値の代入は:=
か=
で行い、:=
の場合には右辺が評価されてから
代入が行われます。
文字列を入れる時は
a := "abc" ;1
a := abc ;2
a = "abc" ;3
a = abc ;4
とするとそれぞれ
abc
- 変数abcに入っていた値
"abc"
("
も含む)abc
がそれぞれ代入されることになるので1と4が同じ結果になります。
数値の場合は
a := 123
a = 123
の両方共一緒です。=
を使って変数の値を渡すには
a= %abc%
の様に、変数を%
で囲みます。
これは他でも同様で、変数の中身を参照するには(MsgBox
で表示させたりするには)
%
で囲みます。
関数
MyFuncion(a="abc",b) {
Send,a
MsgBox,b
Return
}
関数はこの様な形で書きます。 引数にはデフォルト値を与える事もできます。 この関数を呼ぶには
a::MyFuncion("def","ghi")
の様な感じで。
関数内で変数を使いたい場合、関数外の値を参照したり 変更を関数外にも反映したい場合は
global a = "abc"
と各項目でglobalを付けて取り扱うか関数の最初に
c="def"
MyFuncion(a="abc",b) {
global
c:=a
...
の様にglobal
を書いておく必要があります。
この他にGoto
、Gosub
と言うコマンドが有ります。
Goto
は、指定したラベルの位置に飛んで処理を続けるGosub
は、指定したラベルの位置に飛んで処理を続け、Return
が出たところで元の位置に戻ってくる
という処理を行います。
a::
Goto,label1
MsgBox,a
Return
b::
Gosub,label1
MsgBox,b
Return
label1:
MsgBox,label1
Return
とすると、aを押したときはlabel1
のメッセージボックスが出るだけで、
bを押すとlabel1
と表示された後、b
も表示されます。
従って、Gosub
の方は、引数なし関数的な使い方も出来ます。
Windowごとの設定
Window毎にキー設定を変えるには
#IfWInActive ahk_class Notepad
...
の様な形でWinActive
を使います。
これは
#If WInActive("ahk_class Notepad")
...
と書くことも出来ます。
#If
を使うことでそれ以降、その条件下でのみ設定を有効にでき、
WinActive
はその後に続くWindowが最前面の時、となります。
指定を解除するには
#IfWInActive
の様に引数なしで指定するとそれ以降条件無し、に戻ります。
指定出来るのはタイトルか上にあるようなクラス名でこれらは
AutoHotkeyのタスクトレイアイコンを右クリックした際に選べる
Window spy
を使って調べます。
一番上のWindow Title & Class
に
- Title: 無題 - メモ帳
- Class: ahk_class Notepad
が得られます。
複数のWindowを指定したい場合はGroup
を作る事が出来、
GroupAdd Note, ahk_class Notepad
GroupAdd Note, ahk_class WordPadClass
の様にGroupAdd
を使いNote
と言う名前のGroupを作り、
#IfWInActive ahk_group Note
...
とahk_group
で名前を指定します。
FirefoxとThunderbirdのClassが同じ
ahk_class MozillaWindowClass
です。
FirefoxではVimperatorでVimっぽくしていて、 Thunderbirdではメールを書く時にAutoHotkeyでVimっぽくしたいので 割と都合が悪いです。
そこで、タイトルの方を使います。 Thunderbirdのメール作成Windowは
作成:(件名なし)
の様なタイトル名です。もちろん、件名なし
は件名を書いてない状態で、
件名を書き込むと変わります。
ただ、AutoHotkeyでは、一部が一致すれば解釈する様なので、
#IfWinactive 作成:
の様な形で書いておけばThunderbirdの作成Windowで有効にする設定が出来ます。
おそらく他にも作成:
と言ったタイトル名を持つ物はあるので注意が必要です。
(今のところ他に見つけてませんが。)
Window以外にも、変数を使った条件なども使え
#If WInActive("ahk_group Notepad") and (a="enable")
の様にすれば、メモ帳上で、かつ、a
の変数にenable
が入ってる場合に
有効になります
2。
分岐
各キー設定や関数の中でもif
が使えます。
a::
if WInActive("ahk_group Notepad") {
Send,b
}else if (a="enable")
Send,c
}else{
Send,d
}
Return
と言うようにelse if
等も使えます。
(この場合にはIfWinactive
)
この場合にもIfWinactive
が使えますが、
その場合は、{
が必ず次の行にくる必要があります
3。
a::
IfWInActive ahk_group Notepad
{
...
If WInActive("...
の場合は同じ行でも次でもOK。
Loop
繰り返しは
Loop 10 {
MsgBox, %A_Index%
If (A_Index=5){
break
}
Sleep 1000
}
という様にLoop
コマンドではじめ、引数として回数を指定します。
Loopを抜けるためにはbreak
、途中でループ処理を中断して戻ってLoopを再開するにはcontinue
を使います。
数字が省略された場合は、break
で止めるかreturn
などで
その設定/関数自体を終わらせるまで永遠とLoopします。
上の例で使われているA_Index
はLoopの回数で
1から増えていきます。
上の例では、1から5までのメッセージを表示します。
最後にあるSleep
は引数がミリ秒で、この場合ここで1秒待つことになります。
長押しで違うキー設定に
KeyWait
コマンドを使うことで長押しした時に違う命令を送ることが出来ます。
a::
KeyWait, a, T0.5
if (ErrorLevel){
Send,b
Return
}
Send,c
Return
KeyWait
に続き、押されているキー、待つ時間(T
に続き秒
単位で)を書き、
結果がErrorLevel
に収納されます。
指定時間内に
上の例ではaを押して直ぐに話せばc
を、
0.5秒以上押していればb
を送ります
4。
他のファイルを読み込む
他のファイルの
設定ファイルの中で他のファイルを読み込みたい時はinclude
を使い
#Include %A_ScriptDir%\other.ahk
とします。
%A_ScriptDir%
は、読み込もうとしているファイルの位置です。
追記: 2017/08/21
A_ScriptDir
は最初に読み込むファイルの位置になり、
Include
したファイルからさらに他のファイルをInclude
しようとした際、
もし最初にInclude
したファイルがそれを読み込んだファイルと違う位置にあると
上の方法で上手くいかなくなります。
代わりに、その行が書かれた位置でのファイルを見て
ファイルの場所を返すA_LineFile
という変数があるのでこれを使った方が安全です。
#Include %A_LineFile%\..\other.ahk
この変数に関してはA_ScriptFile
に対応するA_ScriptDir
の様な
A_LineDir
と言ったディレクトリを直接返す変数は用意されてないため
ファイルの位置を使う必要がありますが、
Windowsの性質上、ファイルの後に\..\
を使うことで
そのファイルのあるディレクトリを示す事が出来るのでそれを使っています。
(Linuxとかならdirname
コマンドを使うとか/
で区切ってディレクトリを取得したりする必要がありますが。試しにコマンドプロンプトやPowerShellでやってみてもこれが出来ることが確認出来ます。)
追記ここまで
この位置に展開される形になるので、
Auto-execute section
について注意して設定する必要があります。
Happy Hacking Keyboard用設定
Happy Happy Keyboard にあるダイヤモンドキー(スペース両隣のキー)の設定:
; For HHK
vkFFsc079::RAlt
vkFFsc07b::LAlt
など。上の設定では
- 左◇左Alt
- 右◇右Alt
その他参考ページなど
- 本家Document
- AutoHotkey Wiki
- AutoHotkeyを流行らせるページ
AutoHotKeyの使用方法- IME制御用 関数群 (IME.ahk)
- はてブ拡張のタグ付けを補助するAutoHotkeyスクリプト
PuTTYで複数行ペースト前に警告するAHKスクリプト