#include で A_LineFile が使えるようになった

 昨日公開された AutoHotkey_L version 1.1.11 によって、A_LineFile が #include の引数として利用できるようになった。

 今回の改良について、例を挙げながらかみ砕いて説明したい。以下のようなフォルダ構成でファイルを置く。

junk
|-- foo
|   |-- 0inc.ahk
|   `-- 1bar.ahk
`-- test.ahk

 まずはjunk\fooフォルダの内容を見てみよう。junk\foo\1bar.ahkのスクリプトはMsgBoxによってbarを表示するものだ。

MsgBox,bar

 junk\foo\0inc.ahkによって、同一のフォルダにあるjunk\foo\1bar.ahkが読み込まれる。その際にA_ScriptDirが表すのは、このファイルがあるjunk\fooフォルダだ。

#include %A_ScriptDir%\1bar.ahk

 ここまでの処理に問題は何ら存在せず、このjunk\foo\0inc.ahkを実行すればbarが正常に表示される。


 次にjunk\test.ahkからjunk\foo\0inc.ahkを利用してみよう。junk\test.ahkに次のように書くとどうなるだろうか。

#include foo\0inc.ahk

 読み込もうとするファイルが見つからないために、間違いなくエラーが発生するのだ。junk\test.ahk は junk\foo\0inc.ahkを読み込む際にA_ScriptDirに出くわす。先に見たようにjunk\foo\0inc.ahkを実行すれば A_ScriptDir は junk\foo フォルダを指すのだが、junk\test.ahkを実行すると A_ScriptDir は junk\test.ahk のファイルがある junk フォルダを指してしまう。junkフォルダ直下には1bar.ahkが存在しないので、ファイルが読み込めないというエラーが生じてしまうのである。


 それでは、junk\foo\0inc.ahkを単独で実行しても、junk\test.ahkからjunk\foo\0inc.ahkを読み取って実行しても同一の処理をするにはどうすればよいか。そう、#include で A_LineFile を使えばよいのだ。#Include にあるとおり、%A_LineFile%\.. で、#include が記述してあるスクリプトのフォルダを指定することができる。junk\foo\0inc.ahkがあるフォルダ、つまりjunk\foo のフォルダ内の 1bar.ahk を読み込むように、junk\foo\0inc.ahk を次のように書き換えてみよう。

#include %A_LineFile%\..\1bar.ahk

 これで、junk\foo\0inc.ahk を単独で実行しても、junk\test.ahkからjunk\foo\0inc.ahkを読み取って実行しても、同一の結果を取得できる。


 こういうわけで、異なるフォルダのahk スクリプトを読み込もうとするときには、この A_LineFile を是非とも活用したいものだ。