hmPSが秀丸マクロへアクセスする関数

PowerShellから秀丸マクロへアクセスする関数

PowerShellの機能をフルに生かしつつ、秀丸マクロの機能や各種値もほぼ全て使えるところが、
hmPSが優れている所以です。

  • 秀丸マクロをそのまま実行
  • 「秀丸マクロの変数」⇔「PowerShellの変数」を相互にやり取り。

の2つの手段で秀丸マクロを取り扱うことが出来ます。

  • PowerShellから秀丸マクロを実行

    秀丸エディタ 8.66以降では、Hidemaru_EvalMacroという関数が秀丸本体からエキスポートされたため、
    マクロ実行中であれば、秀丸マクロ以外の場所からでもマクロを記述し、実行することが可能となりました。

    • $hm::Macro::Eval( ヒアドキュメント文字列)

      引数の文字列を、「秀丸マクロ」として実行する。

    #PS = loaddll( hidemarudir + @"\hmPS.dll" );
    
    if ( !#PS ) {
        message("hmPS.dllが導入されていません");
        endmacro;
    }
    
    #_ = dllfuncw(#PS, "DoString", R"PowerShell(
    
    #PowerShellの中で、$hm::Macro::Eval関数を使って、秀丸のマクロを書くことが出来る
    $hm::Macro::Eval( @'
      #a = 3;
      debuginfo 1;
      showvars;
      message("あいうえお");
    
      showvars;
    '@
    );
    
    )PowerShell"
    );
    
    freedll( #PS );
    
  • PowerShellから秀丸マクロの変数の読み書き

    • $hm::Macro::Var["変数名"]

      対象の「秀丸マクロ」としてのシンボル名に対応する値を取得する。

    • $hm::Macro::Var["変数名"] = 新たな値

      対象の「秀丸マクロ」としてのシンボル名に、新たな値を設定する。
      (読み取り専用の値には設定出来ません)

    #PS = loaddll( hidemarudir + @"\hmPS.dll" );
    
    #_ = dllfuncw(  #PS, "DoString", R"PowerShell(
    
    # 秀丸マクロの「#aaa」という変数に3を設定。
    $hm::Macro::Var['#aaa'] = 3;
    
    # 秀丸マクロの「$bbb」という変数に「あいうえお」を設定。
    $hm::Macro::Var['$bbb'] = "あいうえお。"
    
    # 秀丸マクロとして一連の文字列を実行
    $hm::Macro::Eval( @'
        message($bbb);
        $$message = $bbb + $bbb;
        message($$message);
    
        // アウトプット枠へ出力
        #OP = loaddll("HmOutputPane.dll");
        #ret = dllfunc(#OP, "Output",hidemaruhandle(0), $$message);
        freedll(#OP);
    '@
    );
    
    $hm::debuginfo( $hm::Macro::Var['$bbb'] );
    $hm::debuginfo( $hm::Macro::Var['filename'] );
    
    $hmdate = $hm::Macro::Var['date'];
    $hm::debuginfo( $hmdate );
    
    )PowerShell"
    );
    
    freedll( #PS );
            

    上記の例はさほど意味がある例題ではありませんが、 実践では「フォーム系」を使ったPowerShell層で、
    「フォームを閉じることなく、イベントハンドラに呼応する形で(フォームを閉じることなく)秀丸を制御したい場合」などに威力を発揮することでしょう。
    又、ループを伴った値の伝達なども、秀丸マクロ層でやるよりも、PowerShell層でやった方が記述が簡潔に済みます。

    #PS = loaddll( hidemarudir + @"\hmPS" );
    
    #_ = dllfuncw( #PS, "DoString", R"PS(
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    class MyForm {
        [int] $counter;
        [System.Object] $form
        [System.Object] $btn
    
        SetForm() {
            $this.form = New-Object System.Windows.Forms.Form;
            $this.form.Text = "こんにちわ";
        }
    
        SetButton() {
            $this.btn = New-Object System.Windows.Forms.Button;
            $this.btn.Text = "クリック";
            $this.btn.Left = 16;
            $this.btn.Top = 16;
            $this.btn.Width = 100;
            $this.btn.Height = 40;
            $this.btn.Tag = $this;
    
            # イベントハンドラも作れる
            $this.btn.Add_Click({
                ($sender, $event) = ($this, $_);
                btn_Click($sender, $event);
            });
    
            $this.form.Controls.Add($this.btn);
        }
    
        Show() {
            $this.counter = 0;
            $this.SetForm();
            $this.SetButton();
     
            $this.form.ShowDialog();
        }
    
    }
    
    
    function btn_Click($sender, $event) {
        $sender.Tag.counter++;
    
        # デバッグモニター用の関数
        $hm::debuginfo("ボタンが押されたよ!!");
        $hm::debuginfo($sender.Tag.counter);
    
        # 秀丸マクロの「変数」とのやりとりも自由自在
        ($filename2) = $hm::Macro::Var['filename2'];
        $hm::debuginfo($filename2);
    
        # 秀丸マクロの「変数」とのやりとりも自由自在
        $hm::Macro::Var['$counter'] = [string]$sender.Tag.counter
        # PowerShellの中から秀丸マクロを一連のコマンドとして実行することも出来る。
        # PowerShellには「ヒアドキュメント」が使えるのでちょうどよい
        $hm::Macro::Eval(
    @'
            // アウトプット枠へ出力
            #OP = loaddll("HmOutputPane.dll");
            #ret = dllfunc(#OP, "Output",hidemaruhandle(0), $counter);
            freedll(#OP);
    '@  );
        }
    
    
    
    $f = New-Object MyForm;
    $f.Show();
    
    )PS"
    );
    
    freedll(#PS);