インクルード元:#Include
って書いてある方
インクルード先:#Include hoge.ahk
のhoge.ahk
とする。
基本
#Include / #IncludeAgainは、スクリプトが実行される前の解析の段階で実行される。
スクリプトが実行されるときには、あたかも#Includeが書かれたところに指定されたスクリプトファイルの内容が書かれているかのようになる。
つまり、仮想的に単一のスクリプトファイルを生成した上で実行されるということ。
実行される段階では、インクルード先のファイルは存在していない。インクルード元のファイルしか存在しない。
組み込み変数A_ScriptPath
が参照するパスはどこ?
よって、これはインクルード元のスクリプトファイルになる。A_ScriptDir
とかも同じ。
しかしながら、特にFileRead
とかで外部ファイルから何かを読み込みたい場合などは、対象ファイルをインクルード先からの相対パスで指定したい場合もあるはず。
そのような場合は、組み込み変数A_LineFile
によって、実行中の行が記述されたファイルのパスを得ることができる。
これをSplitPath
すれば、インクルード先ファイルが存在するディレクトリのパスも得ることができる。
Auto-executeセクションとの関係
Auto-executeセクションについては下記を参照。
スクリプトが読み込まれると、最初にReturnかExitあるいはホットキーラベルが現れるか、スクリプトの終わりに達するまでが実行される。
この部分のことを、Auto-executeセクションと呼ぶ。ホットキーラベルや#Persistent指令、Lock系キーの固定などで常駐状態にされない場合、Auto-executeセクションが終了したらスクリプトは終了する。
#Include
を含むスクリプトにおいては、インクルード実行後にこれが判定される。
つまり、Auto-executeセクションにおいて、#Include
の後に、まだAuto-executeセクションが続く(別の#Include
も含む)場合、インクルード先ファイルの末尾にReturn
/Exit
/ExitApp
を書いてはならない。もちろんホットキーラベルも同様。
最初のReturn/Exitないしはホットキーが現れた時点で、Auto-executeセクションが終了し、続く処理は行われなくなってしまうのだ。
言い換えれば、インクルード先のファイルにおいては、「Auto-executeセクションで実行されるべき処理」と「Auto-executeセクション以外で実行されるべき処理」を両方書くべきではない。
(唯一許容されるのは、「境目」に該当するファイルということになる。)
よって、望ましい#Include
の書き方は以下のようになる。
; ファイル先頭からAuto-executeセクションが開始
; Auto-executeセクションで実行したい処理を書く
SetTitleMatchMode, 2
; Auto-executeセクションで実行したいファイルをインクルードする
# Include AutoExec1.ahk
# Include AutoExec2.ahk
; Auto-executeセクションの終了(省略可)
Exit
; ホットキー等のファイルをインクルードする
# Include HotKey.ahk
# Include HotString.ahk
# Include SubRoutineLabel.ahk