秀丸マクロの「プロセスを横断する」特性と、
   hmJavaVMの「一度実行するとプロセス実行中はずっと有効」な特性

  • 秀丸マクロは「プロセスを横断」出来る特性がある

    秀丸は

    • 「タブモード」で1つの秀丸であるかのように見せかけていようとも
    • 「タブモード」のままバラバラのウィンドウであろうとも
    • 「非タブモード」でそれぞれバラバラのウィンドウであろうとも

    いずれも関係なく、
    以下のようにそれぞれが「プロセスA」「プロセスB」と、プロセスとして別々となります。

     

    ですので、以下の図ような「プロセスA.txt」を開いた状態で、

    以下の「test.mac」のようなマクロを実行すると、

    test.mac
    $currentFileName = filename2;
    
    openfile "プロセスB.txt";
    
    $currentFileName = $currentFileName + "\n" + filename2;
    
    message $currentFileName;
    

    というようになります。

    プロセスA実行中の時のfilename2を拾い、プロセスBへと切り替わった後、
    こちらでもfilename2を拾うので、このようなことになります。

    即ち、秀丸マクロはプロセスを跨いで変数が有効という珍しい特性を持っているのです。
    「意識せずともプロセス間をシームレスに横断してデータの相互受け渡しが可能になっている」ということです。

  • 秀丸マクロは「全ての秀丸で合わせて、たった1つのマクロ」しか実行できない

    しかし、秀丸マクロには大きな弱点があります。

    それは、先述の良い特性の裏返しとも言えますが、
    秀丸マクロは、「全ての秀丸プロセスであわせて、たった1つの秀丸マクロ」しか実行できないのです。

  • hmJavaVMは「一度実行するとプロセス実行中はずっと有効」な特性がある

    このことは自動起動マクロとhmJavaVMによるイベントハンドラにて、
    説明されていることです。
    そのページでもわかるように、秀丸マクロが瞬間的に実行し、瞬間的に実行を終了してしまったとしても、
    hmJavaVMは、一度実行された後は、そのプロセス内で常駐しており、値や処理が継続されていることがわかります。

  • 秀丸マクロの「プロセス間の横」とhmJavaVMの「時間の縦」を組み合わせると…

    以上の2つの特性を組み合わせると、以下のような図式が見えてきます。

    • 秀丸マクロは「瞬間実行・プロセス横断は自由自在」
    • hmJavaVMは「プロセス横断はしないが時間は縦断し続けている」

    この2つの組み合わせることで、
    データや処理を縦に横にと伝搬することが出来るのです。

  • やるべきでないこと

    hmJavaVMの Java記述の中で、「プロセスを切り替える」ような関数を呼び出すのは、
    制御がコントロールできなくなるのでやめるべき
    です。

    そのような場合は、一旦「現在のhmJavaVM」から脱出してから、
    プロセスを切り替え、
    再度、改めてそのプロセスでhmJavaVMを起動します。

    その際、必要な値を「秀丸マクロの変数」で運ぶことが出来ます。

    $my_variable = "";
    
    #JAVA1 = loaddll(hidemarudir + @"\hmJavaVM.dll");
    
    // この関数(Java側のメソッド内)で、秀丸の変数「$my_variable」に値を設定しているとする。
    #_ = dllfuncw(#JAVA1, "CallMethod", "Class", "Method1");
    
    freedll(#JAVA1);
    
    // この1行を実行すると、新しい「無題」編集ペインが作られ、プロセスが切り替わる
    newfile;
    
    // プロセスが切り替わったので、#JAVA1にはアクセス出来なくなっている。
    // しかし、#JAVA1から伝達した$my_variableは「秀丸マクロ」としての値なので、プロセスが変わっても継続している。
    
    // このJAVA2はプロセスが変わっているので、#JAVA1とは実体が異なる
    #JAVA2 = loaddll(hidemarudir + @"\hmJavaVM.dll");
    
    // この関数(Java側のメソッド内)の中では、秀丸の変数「$my_variable」は値を読むことが出来る。
    #_ = dllfuncw(#JAVA1, "CallMethod", "Class", "Method2");
    
    freedll(#JAVA2);