ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】一つの機能を複数のファイルから利用したい。

一つのとても便利な機能があるとします。
普段はAutoHotkeyスクリプトを常駐させてWin+Insホットキーで起動することで利用しています。
ところがこれをAutoHotkeyスクリプト実行させる形でも利用したくなりました。
ホットキーをトリガーとせずにコマンドラインやバッチファイルで機能を実行したいと 。
最高にシンプルな方法は実行と常駐二つのファイルを用意して、ホットキー以外の部分を丸っとコピーすることです。
常駐させる方のスクリプトをmain.ahk としまして。

#Insert::
    MsgBox called
    return

実行させる方のスクリプトをsub.ahkとしまして。

    MsgBox called
    return

これなら確実なんですが、 いくつかの修正を重ねるうちに実務部分の処理をコピーし損ねるなどで、やがて破綻します。
それを避けるには実務処理を一つのファイルにまとめて各ファイルから起動してやるしかありません。
安直に思いつくのは send コマンドでホットキーを実行させてやること。
メインはそのままに、サブの方からこうします。

sub.ahk

Send, #{Insert}

これを実行すればホットキーを送信するのでメッセージボックスが表示されるはずです 。
しかしこれはうまくいきません。
試しに上書きするホットキーを Windows + S に変更してみますと、スタートメニューが起動しました。
本来はスタートメニューのショートカットなので、AutoHotkeyの定義をスルーしていることになりますね 。
sendコマンドはキーコードを送信するのでAutoHotkeyで上書きした機能ではなく、 Windows で本来定義されているショートカットの機能が呼ばれるではないかと想像しています 。

実のところこれで半日ほど溶かしてしまっています。
日本語の情報では限界があるので英語サイトを含めて検索します。
以前はいつも英語検索だったのですが音声入力が便利すぎると日本語しか使えませんね。

www.google.com

それっぽいのが見つかりました。

stackoverflow.com

そこで# include を利用します。
# include は同じディレクトリ階層にある 別のスクリプトを読み込みます。

ahkwiki.net

メインのスクリプトを取り込んでからGosubコマンドでsubを呼び出せば良いのではないでしょうか。

main.ahk

#Insert::
    Gosub, sub
    Return
sub:
    MsgBox called
    return

sub.ahk

#Include, main.ahk
    Gosub, sub
    Return

ところがこれはsub.ahk側で動きません 。
純粋にsubサブルーチンを呼び出して終了するだけなのですが、 メッセージボックスは表示されません 。subサブルーチンは定義されていますが実行されません。
なんでかなぁ。

documentを読み漁っていると 関数ライブラリスクリプトという機能があるのですね。

ahkwiki.net

なんだよ関数名から自動的にファイル名を連想して読み込みずつ実行してくれるなんて!
すごい便利じゃない。
これなら include いらないじゃん 。

呼び出し側のファイルに関数が見つからない場合に関数ライブラリを探しに行きます。
ファイルを探しに行くのは3箇所です。
今回は,呼び出し側の一個下の階層のlibディレクトリに配置することにします。
ライブラリ側のファイル名は関数名と同じにしておきます。
探索パターンは何通りもありますから、必ずしもファイル名=関数名でなくても良さそうです 。

mainスクリプトのあるディレクトリの下にlib ディレクトリを作って、そこに実務処理部分sub.ahkを用意します。
直ちに実行する方のスクリプトWinIns.ahkはmain.ahkと同じ階層に作成します。
WinIns.ahkとmain.ahkの両方から関数ライブラリsubを呼び出します。
これでどうでしょう。

main.ahk

#Insert::
    sub()
    Return

WinIns.ahk

sub()
return

lib\sub.ahk

sub(){
    MsgBox called
    return
}||<

とても便利ですね。