今開いている秀丸に対して grep したい #4
前回作った秀丸に対して横断 grep を行うマクロ、HmAltGrep は、もっさりした動作なので、とりあえずこれを高速化しようとしてみた。
もっさり動作は Java VM 起動が原因だと思うので、Java VM の起動は一回のみにして常駐され、マクロ起動ごとに常駐している Java プロセスとソケット通信を行うようにしてみた。
ただ、常駐する Java 側は良いとして、マクロ側は何らかの方法でクライアントソケットとサーバソケットをマクロ側で保持しておく必要があって、その仕組みに秀丸のフィルタ機能が使えそうだ。
秀丸のフィルタは DLL で特定のインターフェイスを実装しておくと、秀丸のメニューやマクロから呼び出せるというもので、動作的には:
- filter 文または filter 関数をマクロから呼び出すと
- 初回は DLL がロードされ、二回目以降はロード済みのインスタンスが使用される
ということのようだ。
これなら、初回起動時に Java VM を起動して、ソケットでセッションを確立しておけば、二回目以降はすいすい動きそう。
で、昨日バージョン 0.01 を作り終えた後すぐに、C++ で DLL を作って、Java とソケット通信を行う実装をした。簡単なプロトコルを設計して、通信部分の評価は大体完了したところで、マクロとして動作するように肉付けしているときに、気が付いてしまった。
秀丸のフィルタ機能は、確かに上述のように二回目以降は呼び出されないんだけど、別の秀丸から同じマクロを実行すると、同時に同じ DLL がロードされてしまう。
うかつだった。
秀丸をタブ化して使っているので、ついひとつのプロセスのように考えてしまっていたけど、タスクマネージャを見ればわかるとおり、全部異なるプロセスで動いているので、DLL のインスタンスは共有されないのは当然といえば当然だ。
ただ、方向性は悪くないはずなので、この方向でもう少し進める予定。