今開いている秀丸に対して grep したい #4

前回作った秀丸に対して横断 grep を行うマクロ、HmAltGrep は、もっさりした動作なので、とりあえずこれを高速化しようとしてみた。

もっさり動作は Java VM 起動が原因だと思うので、Java VM の起動は一回のみにして常駐され、マクロ起動ごとに常駐している Java プロセスとソケット通信を行うようにしてみた。

ただ、常駐する Java 側は良いとして、マクロ側は何らかの方法でクライアントソケットとサーバソケットをマクロ側で保持しておく必要があって、その仕組みに秀丸のフィルタ機能が使えそうだ。

秀丸のフィルタは DLL で特定のインターフェイスを実装しておくと、秀丸のメニューやマクロから呼び出せるというもので、動作的には:

  • filter 文または filter 関数をマクロから呼び出すと
  • 初回は DLL がロードされ、二回目以降はロード済みのインスタンスが使用される

ということのようだ。

これなら、初回起動時に Java VM を起動して、ソケットでセッションを確立しておけば、二回目以降はすいすい動きそう。



で、昨日バージョン 0.01 を作り終えた後すぐに、C++ で DLL を作って、Java とソケット通信を行う実装をした。簡単なプロトコルを設計して、通信部分の評価は大体完了したところで、マクロとして動作するように肉付けしているときに、気が付いてしまった。

秀丸のフィルタ機能は、確かに上述のように二回目以降は呼び出されないんだけど、別の秀丸から同じマクロを実行すると、同時に同じ DLL がロードされてしまう。

うかつだった。

秀丸をタブ化して使っているので、ついひとつのプロセスのように考えてしまっていたけど、タスクマネージャを見ればわかるとおり、全部異なるプロセスで動いているので、DLL のインスタンスは共有されないのは当然といえば当然だ。

ただ、方向性は悪くないはずなので、この方向でもう少し進める予定。