hmRbが持つ特別な関数一覧

  • ヒアドキュメント

    hmRbの機能ではなく、秀丸マクロの機能となりますが、hmRbと関係が深いものとして、
    秀丸エディタ 8.66では、C++の「R""」やC#の「@」のようなものが秀丸マクロで利用可能となっています。

    このため、秀丸マクロ内に、IronRubyをそのまま直接書き込めるようになりました。
    これは非常に大きなメリットと言えるでしょう。

    又、8.66以前のバージョンでは秀丸マクロの文字列リテラル(べた書きの文字列)の最大長は4Kバイトでしたが、
    8.66以降では、64Kバイトとなりました。
    これは、「連続1500行程度のIronRubyをマクロ内に直接張り付けることが出来る」ことを意味します。

  • デバッグ用途関数

    デバッグ用途として以下の関数を利用し、「秀丸デバッグモニター」などに値や文字列を表示することが出来ます。

    • $hm.debuginfo( 文字列 )

      対象の文字列を、システムデバッガへと文字列を転送します。
      「秀丸デバッグモニター」などに値や文字列を確認することが可能です。

  • 秀丸本体のバージョン

    秀丸本体のバージョンを数値として取得します。

    • $hm.version

      秀丸 8.7.3.β3 の場合は、873.03、
      秀丸 8.7.3.β10 の場合は、873.10、
      秀丸 8.7.3 正式版 の場合は、873.99、
      といったような値が返ってきます。

  • 編集中エディタに対する関数

    現在秀丸エディタで開いているテキストに対して、以下の関数を利用することが出来ます。

    • テキスト全体

      • $hm.Edit.TotalText

        現在編集中の秀丸エディタのテキスト全体を得る

      • $hm.Edit.TotalText = "文字列"

        現在編集中の秀丸エディタのテキスト全体を、文字列へと変更する

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw( #RB, "DoString", R"IRONRUBY(
      totaltext = $hm.Edit.TotalText;
      $hm.debuginfo(totaltext);
      
      $hm.Edit.TotalText = "あいうえお";
      )IRONRUBY");
      
      freedll( #RB );
      
    • 選択中のテキスト

      (単純選択のみが対象となります。ボックス選択や複数選択は対象にはなりません)

      • $hm.Edit.SelectedText

        現在編集中の秀丸エディタの「選択している」テキストを得る。

      • $hm.Edit.SelectedText = "文字列"

        現在編集中の秀丸エディタの「選択している」テキストを、"文字列"へと置き換える。

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw( #RB, "DoString", R"IRONRUBY(
      # 何かを単純選択していたら、テキストが得られる
      selectedtext = $hm.Edit.SelectedText;
      $hm.debuginfo(selectedtext);
      
      $hm.Edit.SelectedText = "選択しているテキストをこの文字列に置き換えた";
      
      )IRONRUBY");
      
      freedll(  #RB );
      
    • カーソルがある行のテキスト

      • $hm.Edit.LineText

        現在編集中の秀丸エディタの「カーソルがある行」のテキストを得る。

      • $hm.Edit.LineText = "文字列"

        現在編集中の秀丸エディタの「カーソルがある行」のテキストを、文字列へと置き換える。

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw(  #RB, "DoString", R"IRONRUBY(
      linetext = $hm.Edit.LineText;
      $hm.debuginfo(linetext);
      
      # 行のテキストを入れ替える感じにするなら、最後に「\n」を付けること。
      $hm.Edit.LineText = "カーソル行のテキストをこれに変更\n";
      )IRONRUBY");
      
      freedll(  #RB );
      
    • カーソルの位置

      • $hm.Edit.CursorPos.lineno

        現在選択中の秀丸エディタのカーソル位置の行番号を得る。
        秀丸マクロのlinenoと同じ値。

      • $hm.Edit.CursorPos.column

        現在選択中の秀丸エディタのカーソル位置のカラム値を得る。
        秀丸マクロのcolumnと同じ値。

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw( #RB, "DoString", R"IRONRUBY(
      lineno = $hm.Edit.CursorPos.lineno;
      column = $hm.Edit.CursorPos.column;
      $hm.debuginfo( lineno.to_s + "," + column.to_s );
      )IRONRUBY");
      
      freedll(  #RB );
      
    • マウスの位置に対応するカーソルの位置(秀丸エディタ v8.73以上)

      • $hm.Edit.MousePos.lineno

        現在選択中の秀丸エディタの「マウスの位置に対応するカーソル位置」の行番号を得る。

      • $hm.Edit.MousePos.column

        現在選択中の秀丸エディタの「マウスの位置に対応するカーソル位置」のカラム値を得る。

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw( #RB, "DoString", R"IRONRUBY(
      lineno = $hm.Edit.MousePos.lineno;
      column = $hm.Edit.MousePos.column;
      $hm.debuginfo( lineno.to_s + "," + column.to_s );
      )IRONRUBY");
      
      freedll(  #RB );
      
  • IronRubyから秀丸マクロへアクセスする関数

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

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

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

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

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

      • 現行バージョンのバグ

        IronRubyの内部的な不具合により、$hm.Macro.Evalに最初にヒアドキュメントを渡すと、NullReferenceErrorが出ることがあります。
        これはhmRbではなく、IronRuby自体に存在する根深いバグです。
        このような、場合は、下記サンプルの

                    $hm_version = $hm.Macro.Var["version"];
                    
        のような$hm.***へとアクセスするダミーの記述を、ソースの先頭に記載しておいてください。

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

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

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      if ( !#RB ) {
          message("hmRb.dllが導入されていません");
          endmacro;
      }
      
      #_ = dllfuncw(#RB, "DoString", R"IRONRUBY(
      $version = $hm.Macro.Var["version"]; # インスタンス状態を整えるダミーの記述
      
      py_x = 100
      
      #ironrubyの中で、$hm.Macro.Eval関数を使って、秀丸のマクロを書くことが出来る
      $hm.Macro.Eval <<'MACRO'
        #a = 3;
        debuginfo 1;
        showvars;
        message("あいうえお");
      
        showvars;
      MACRO
      ;
      
      )IRONRUBY"
      );
      
      freedll( #RB );
      
    • IronRubyから秀丸マクロの変数の読み書き

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

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

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

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

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

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

      #RB = loaddll( hidemarudir + @"\hmRb.dll" );
      
      #_ = dllfuncw(  #RB, "DoString", R"IRONRUBY(
      require 'mscorlib'
      require "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      require "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
      
      include System::Windows::Forms
      include System::Drawing
      
      $result_from_ruby = $hm.Macro.Var['date']; # 秀丸マクロの「date」シンボルの文字列
      
      class IronRubyForm < Form
      
        def initialize()
          self.Text = 'こんにちわ'
          self.Size = Size.new(400, 200)
          @btn = Button.new
          @btn.Location = Point.new(16, 16)
          @btn.Width = 200
          @btn.Text = "クリック"
          @btn.Click { |sender, e| self.btn_Click(sender, e) }
      
          @count = 0;
      
          self.Controls.Add(@btn)
        end
      
        def btn_Click(sender, e)
          @count += 1;
            $hm.Macro.Var['$count'] = @count.to_s
            MessageBox.Show( "今開いているファイルは…\n" + $hm.Macro.Var['filename2'] );
      
            $hm.Macro.Eval <<-'MACRO'
              // アウトプット枠へ出力
              #OP = loaddll("HmOutputPane.dll");
              #ret = dllfunc(#OP, "Output",hidemaruhandle(0), $count);
              freedll(#OP);
            MACRO
        end
      
      end
      
      
      f = IronRubyForm.new
      f.ShowDialog
      
      )IRONRUBY"
      );
      
      freedll( #RB );
              
  • DestroyScope関数

    IronRuby内に「DestroyScope」という名前の関数を用意しておくと、
    マクロ終了時に自動的にその関数が実行されます。

    #RB = loaddll( hidemarudir + @"\hmRb.dll" );
    
    #_ = dllfuncw( #RB, "DoString", R"RB(
    
    def DestroyScope()
      $hm.debuginfo("マクロ終了する直前に自動的にこの関数が呼び出される。");
    end
    
    )RB"
    );
    
    freedll( #RB );
    
  • 簡易なHTMLエンコードの例

    #RB = loaddll( hidemarudir + @"\hmRb.dll" );
    
    if (! #RB) {
      message("hmRBが導入されいません。");
      endmacro;
    }
    
    #_ = dllfuncw( #RB, "DoString", R"IRONRUBY(
    load_assembly("System.Web")
    import System
    
    html = System.Web.HttpUtility.HtmlEncode($hm.Edit.TotalText)
    html = html.Replace("\r\n", "\r")
    html = html.Replace("\n", "\r")
    html = html.Replace("\r", "<br>\r\n")
    html = html.Replace("  ", " &nbsp;")
    
    $hm.Edit.TotalText = html
    
    )IRONRUBY"
    );
    
    freedll( #RB );