hmPython3が持つ特別な関数一覧

  • デバッグ用途関数

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

    • 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 = "文字列"

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

      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      totaltext = hm.Edit.TotalText;
      hm.debuginfo(totaltext);
      
      hm.Edit.TotalText = "あいうえお";
      )PY");
      
      freedll( #PY );
      
    • 選択中のテキスト

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

      • hm.Edit.SelectedText

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

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

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

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

      • hm.Edit.LineText

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

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

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

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

      • hm.Edit.CursorPos.lineno

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

      • hm.Edit.CursorPos.column

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

      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      pos = hm.Edit.CursorPos
      hm.debuginfo( str(pos.lineno) + "," + str(pos.column) );
      )PY");
      
      freedll( #PY );
      
    • マウスの位置に対応するカーソルの位置(秀丸エディタ v8.73以上)

      • hm.Edit.MousePos.lineno

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

      • hm.Edit.MousePos.column

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

      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      mpos = hm.Edit.MousePos
      hm.debuginfo( str(mpos.lineno) + "," + str(mpos.column) );
      )PY");
      
      freedll( #PY );
      
  • Pythonから秀丸マクロへアクセスする関数

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

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

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

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

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

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

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

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

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

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

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

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

      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw(  #PY, "DoString", R"PY(
      
      from hmPython import *
      
      # 秀丸マクロの「#aaa」という変数に3を設定。
      hm.Macro.Var['#aaa'] = 3;
      
      # 秀丸マクロの「$bbb」という変数に「あいうえお」を設定。
      hm.Macro.Var['$bbb'] = "あいうえお。"
      
      # 秀丸マクロとして一連の文字列を実行
      hm.Macro.Eval( r'''
          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 );
      
      )PY"
      );
      
      freedll(  #PY );
              
  • DestroyScope関数

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

    これは、少し時間が長くかかる処理をPython層で実行している最中に、
    突如として「秀丸エディタ」を閉じてしまった、などの際にも呼び出されるという性質を持ちますので、
    「この処理だけはクローズしておきたい」といった
    「全体の処理のfinally句」的な意味で利用することが出来ます。

    #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
     
    #_ = dllfuncw( #PY, "DoString", R"PY(
    
    from hmPython import *
    
    def DestroyScope():
        hm.debuginfo("マクロ終了する直前に自動的にこの関数が呼び出される。\n")
    
    )PY"
    );
     
    freedll( #PY );
    
    
  • 普通のPython的ソースの中に、hmPython3の関数が混じる例

    以下は、Pythonスクリプト全体の中で、秀丸専用関数となるhm.Edit.TotalTextを利用した例となります。
    スクリプト全体の中で、hmPython3専用関数が使われるイメージのようなものの参考としてください。

    #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
    
    if (! #PY) {
      message("hmPython3が導入されいません。");
      endmacro;
    }
    
    #_ = dllfuncw( #PY, "DoString", R"PY(
    
    from hmPython import *
    
    from html.parser import HTMLParser
    
    class MyHTMLParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            hm.debuginfo("Encountered a start tag:" + ',' + str(tag))
    
        def handle_endtag(self, tag):
            hm.debuginfo("Encountered an end tag :" + ',' + str(tag))
    
        def handle_data(self, data):
            hm.debuginfo("Encountered some data  :" + ',' + str(tag))
    
    parser = MyHTMLParser()
    parser.feed(hm.Edit.TotalText)
    
    )PY"
    );
    
    freedll( #PY );