#include で A_LineFile が使えるようになった
昨日公開された AutoHotkey_L version 1.1.11 によって、A_LineFile が #include の引数として利用できるようになった。
- AutoHotkey v1.1.11 - Announcements - AutoHotkey Community
- A_LineFile support in #Include - Suggestions - AutoHotkey Community
今回の改良について、例を挙げながらかみ砕いて説明したい。以下のようなフォルダ構成でファイルを置く。
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 を是非とも活用したいものだ。