AutoHotKeyはキーボードカスタマイズソフトとして使う場合、ただ1つのファイルで運用しても問題無いかもしれません。
しかし関数などを定義するとファイルの行数は増え続け、結果的に管理しにくい状態に陥ってしまいます。そんな事態にならないためにも、ファイルは用途や機能別に分割しておくのが賢いやり方です。
今回は常駐ファイルに別のファイルの内容を読み込む方法についてお話します。
別の.ahkファイルを読み込む
同ディレクトリのファイル
最初に起動する(常駐する).ahkファイルを「main.ahk」とします。
このmain.ahkと同じディレクトリに置いた別の.ahkファイルを使いたいとします。例えばランチャ機能をまとめた「launcher.ahk」があるとしましょう。
このlauncherをmainに読み込ませるには、main側に
#Include launcher.ahk
と記述します。1つのフォルダで全てのファイルを管理できるような場合、別ファイルを読み込む文法はこれだけで問題ありません。
別ディレクトリのファイル
読み込むファイルが別のディレクトリにある場合、絶対パスで指定するのに便利なのが「A_ScriptDir」です。
#Include %A_ScriptDir%\launcher.ahk
このA_ScriptDirは組み込み変数です。この変数はスクリプトファイルが置かれたパスを表します。ここではmain.ahkが置かれたフォルダパスです。
確認するためにダイアログで表示してみましょう。
vk1D & P::MsgBox, %A_ScriptDir%
;D:\Dropbox\autohotkey(無変換キー+Pでスクリプトファイルのあるディレクトリが表示される)
この変数を使うと、例えば下のようにsubフォルダの下にランチャファイルがある場合…
.
├── sub
│ └── launcher.ahk
├── main.ahk
#Include %A_ScriptDir%\sub\launcher.ahk
とすることでランチャファイルを指定することができます。
通常の記述で#Include sub\launcher.ahk
でも問題無く動きますが、この場合相対パスでの指定になります。相対パスか絶対パスかで選択しましょう。
関数ライブラリを読み込む
Include無しで動く関数
次に関数を別ファイルに保存した場合を考えてみましょう。sample.ahkという名前のファイルに、ファイルと同名のsample()という関数が定義されているとします。
sample() {
MsgBox %A_YYYY%年%A_MM%月%A_DD%日%A_DDDD%
}
このsample.ahkを、main.ahkがあるディレクトリに置いたLibフォルダに収めます。フォルダ構成はこのような感じ。
.
├── Lib
│ └── sample.ahk
└── main.ahk
次にこの関数を呼び出す記述をmain.ahk側に加えます。
vk1D & 0::sample() ;無変換+0でsample関数を呼び出す
リロードして実行すると、
「#Include」を記述していないにも関わらず、関数は正しく実行されます。これは「関数ライブラリ」としてsample.ahkを扱い、AutoHotKeyが自動的にファイルを検索してインクルードしているためです。
検索のルール
自動検索にはそれなりのルールがあります。検索するディレクトリは、
- %A_ScriptDir%\Lib (スクリプトファイルがあるディレクトリのLibフォルダ)
- %A_MyDocuments%\AutoHotkey\Lib (ドキュメントフォルダ\AutoHotKey\Lib)
- AutoHotkey.exeのあるフォルダ\Lib (通常はC:\Program Files\AutoHotkey\Lib)
この3ヶ所です。デフォルトの状態ではどれも存在しないので、ユーザーが作成する必要があります。さらに関数名とファイル名が同じでないと検索にヒットしないので、自動では使用できません。
またインクルードされるのは関数単体ではなく、ファイル全体であることも注意しましょう。意図しないコードが実行されてしまう恐れがあります。