本来のhmPython.pyの代わりとなるフェイクのhmPython.py

  • 本当のhmPython.pyと、フェイク(モック)のhmPython.py

    本当のhmPython3.dll、hmPython.pyは、「秀丸エディタのインプロセス」。
    すなわち、秀丸実行中に秀丸の一部として実行することが想定されています。

    インプロセスによる稼働は、該当アプリケーションと該当言語ライブラリの連携を最高にするため、
    とても利便性が高まる反面、
    親アプリケーションに依存する組み込みスクリプト言語になるがゆえに、
    デバッグがしにくい
    、という問題があります。
    (このようなデバッグがしにくいという問題から無縁なのは、
    秀丸マクロ代替言語シリーズの中では、C#での作成が想定される「hm.NET」だけです。)

    hmPython3も、多分に漏れずリモートデバッグを通せば、「ステップ実行」や「値監視」などの
    デバッグが可能ですが、tcp通信などが要求されるため、
    概ね企業のセキュリティ下では、そのようなデバッグ手法は採れない
    ことが想像出来ます。

    このような環境で、「hmPython3用(=秀丸用)」に作成したPythonプログラムを、
    (不完全ながらも)秀丸を通さずに実行するのに手軽な手段は、
    「秀丸本体を仮想とみなし、モックを用意すること。
    即ち、hmPython.pyの代わりをするフェイククラスを用意すること」 です。

  • フェイク(モック)のhmPython.py

    フェイクのhmPython.pyは、秀丸エディタ直下ではなく 秀丸エディタのサブディレクトリ「HmPython3\_hmPython3_etc\fake」ディレクトリ内にあります。

    自身でhmPython3用のpythonプログラムを作成する場合には、
    このフェイクの方のhmPython.pyファイルを適当にコピーしてインポートすると良いでしょう。

    フェイク(モック)のhmPython3.pyの使い方
    from hmPython import *
    
    # 秀丸が存在しないモックとなるので、
    # 「想定するリクエスト」に対応する値は自分で入れておく
    if not "hidemaru" in globals():
        hm.Macro.Var["x"] = 33
        hm.Macro.Var["date"] = "17/09/26(火)"
        hm.Macro.Var["lineno"] = 33
    
        hm.Edit.TotalText = "あああああああ"
    
    
    hm.debuginfo(hm.version)
    
    ret = hm.Macro.Eval(r'''
        message "OK";
    ''')
    
     # 秀丸本体が無いので内部実装はただのハッシュマップとなっている
    hm.Macro.Var["$aaa"] = "あいうえお";
    
    hm.debuginfo(hm.Macro.Var["$aaa"]);
    
    date = hm.Macro.Var['date']
    hm.version = 3 # エラーとなる
    hm.debuginfo(hm.version)