hmPy (秀丸マクロ用 .NET Framework ライブラリ via IronPython)

概要

IronPythonを用いて、秀丸マクロで「.NET Frameworkの多くの機能をシームレスに近い形で利用する」ためのライブラリとなります。

PICTUREPICTURE

ダウンロード

Windowsのbit数ではなく、秀丸のビット数 Windows OSが64bit版か32bit版かは関係ありません。秀丸エディタが32bit版か64bit版かでダウンロード対象を選択してください。

動作環境

  • 秀丸

    秀丸エディタ ver8.73以上

  • Microsoft VC++ 再頒布可能パッケージ

    Visual Studio 2017 C++ ランタイム
    x86版をインストールしたことが無い方はインストールしてください。
    お手持ちのOSが64bitか32bitかには関わりなく、x86版のインストールが必要です。

  • Microsoft .NET

    .NET Framework 4.8以上。

  • IronPython 3.4.1.1

    https://github.com/IronLanguages/ironpython3/releases/tag/v3.4.1より、
    IronPython 3.4.1.1を「.msiのインストーラーを利用して」インストールしてください。
    (※インストーラーを経由してインストールすることでアセンブリのGAC登録などがされます)

    正確に、このバージョン「3.4.1.1」である必要性があります。

  • 秀丸エディタ 64bit版について

    秀丸エディタ64bit版をご利用の方は、hmPy_x64.zipをダウンロードし、hmPy.dllを差し替えてください。
    (又、この場合は、Microsoft VC++ 再頒布可能パッケージは、64bit版をインストールしてください。)

  • 秀丸エディタ ストアアプリ版について

    hmPyはストアアプリ版でも利用することが出来ます。詳細は左メニューのストアアプリ版での利用などを参照してください。

インストール

  • 「hmPy.config」を編集する。
    「C:/usr/ironpython」の部分をIronPythonをインストールした「フォルダ」に変更してください。
    hmPy.confg
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="IronPythonFolder" value="C:/usr/ironpython" />
        </appSettings>
    </configuration>
            
  • hmPy.zipを解凍する。
  • hmPy.dll」と「hmPy.py」と「hmPy.config」を秀丸エディタのディレクトリ内(hidemaru.exeと同じ場所)へと コピーする。
    (原則的には、hidemaru.exeと同じ場所である必要があります。これは.NET FrameWorkのdllを動作させる仕組みに拠るためです。)

特徴

  • .NET Frameworkの多くの機能が利用可能。

    秀丸マクロから「.NET FrameWork」の「System.Windows.Formsコンポーネント系」を実行した例
    PICTURE
  • pythonに秀丸マクロの関数群があるかのように利用可能

    from hmPy import * とすることで、
    秀丸のキーワードや関数等を、pythonの関数としてインポートできます。

  • 汎用言語「IronPython」

    プログラミング言語としては「Python」派生の1つとなる「IronPython」となります。
    「IronPython」はMicrosoftによって「Visual Studio 2010・2012・2013・2015・2017」にて正式にサポートされて続けていた数少ない言語の1つです。
    残念ながら Visual Studio 2019 にてサポートから外れましが、Visual Studio 2019 や Visual Studio 2022 であっても、
    Pythonの環境としてIronPythonを指定するとデバッグ機能が Visual Studio と統合される形で上手く機能します。

利用シーン

  • マクロ内で豊富な.NETのAPIの機能を利用したい!!

    WindowsのAPIを綺麗に使いやすくした .NETを 秀丸マクロで取り扱うことが出来ます。

    • 文字列処理
    • ウィンドウズの各機能へのアクセス
    • 各種GUIコンポーネントやイベントハンドラ
    • インターネット上のデータの取得
    • 各種ファイル処理
    • 並列スレッド
    • 簡易な数学計算

    に至るまで、.NET Frameworkへと自由に美しくアクセス可能です。

  • 秀丸エディタ 8.66 以降では、IronPythonをそのままマクロ内に記述出来る!!

    秀丸エディタ 8.66にて、「ヒアドキュメント」が実装されたため、
    IronPythonをそのままマクロ内に記述出来るようになりました。(エスケープ等の必要性がなくなりました!)
    詳細は後述されています。

  • 秀丸マクロの言語としてのパワーが弱い!! 汎用言語の記述力が欲しい!!

    IronPythonは、プログラミング上の「文法記述」としては、Python2.7とほぼ完全互換です。
    Pythonは世界中で、そして、あらゆる分野で利用される世界トップクラスの人気の言語です。

  • インプロセスで動作する!!

    これまで秀丸マクロライブラリなどに、よくあがっていたマクロ
    「別途インタプリタが別プロセスとして実行され、その実行結果を返します」
    といったものが大半でした。
    (例えば、別途Perlインタプリタが入っていれば、それを呼び出し、解釈し、結果をアウトプット枠に表示します、など)

    しかし、このhmPyは違います!!
    秀丸マクロと同じプロセス空間で動作していますので、ガッチリ秀丸と完全連携しています。

IronPythonである理由。

  1. 「ShiftJIS(CP932)との文字列やファイルのIOの文字コード」の変換を、可能な限り自然に隠ぺい的に行ってくれる
  2. .NET FrameWorkの大半の機能が自然な表記で使える
  3. 世界で10本の指には入るユーザー数が存在するプログラミング言語、もしくはその派生言語。
  4. 少なくとも1日あたり100万人以上の使用ユーザーが居るメジャーな開発環境で
    2017年現在、正式ツールとして組み入れられている。
このすべて満たす「スクリプト言語」は、あらゆる言語の中で「IronPython」だけです。

秀丸マクロとIronPythonの連携

  • HTMLにJavaScriptを埋め込むような感覚で、秀丸マクロにIronPythonを文字列として埋め込むことが出来ます。
    複数個所に埋め込んでも、記述の内容は持続性を持っています。
    又、HTMLに対するJavaScript同様に、中に埋め込むのではなく、ファイルの外に記述してもかまいません。

秀丸のjsmodeのような関数群が利用できる

#PY = loaddll( hidemarudir + @"\hmPy.dll" );

// 以下の文字列を「IronPythonの環境スコープへと追加書き込みし、追加分だけ実行する」
#_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
from hmPy import *

message("あいう", "それで");

title("タイトルを変更");
title(-1); # マクロ終了後も維持

)IRONPYTHON"
);

freedll(#PY);

秀丸 v9.19以降では、秀丸マクロ内に埋め込む際に以下のようにより自然に記述ができます

#PY = loaddll( hidemarudir + @"\hmPy.dll" );

// 以下の文字列を「IronPythonの環境スコープへと追加書き込みし、追加分だけ実行する」
#_ = dllfuncw(#PY, "DoString", 
""""""""""""""""""""""""""""""""""""""""""""""""""
from hmPy import *

message("あいう", "それで");

title("タイトルを変更");
title(-1); # マクロ終了後も維持

""""""""""""""""""""""""""""""""""""""""""""""""""
);

freedll(#PY);

一番簡単なソース例

「a」に「3」、「b」に「10」を定義し、足しこんで表示。

    #PY = loaddll( hidemarudir + @"\hmPy.dll" );
    
    // 以下の文字列を「IronPythonの環境スコープへと追加書き込みし、追加分だけ実行する」
    #_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
    a = 3
    b = 10
    
    hm.Macro.Var["#a"] = a  # python空間 ⇒ 秀丸マクロ空間へ代入
    hm.Macro.Var["#b"] = b  # python空間 ⇒ 秀丸マクロ空間へ代入
    
    # 秀丸マクロとして文字列を評価して実行
    hm.Macro.Eval( r"""
        message(str(#a));
        message(str(#b));
    """
    );
    
    c = a + b
    hm.debuginfo(c)  # DebugMonitorに表示。
    
    hm.Macro.Var["#c"] = c  # python空間 ⇒ 秀丸マクロ空間へ代入
    
    )IRONPYTHON"
    );
    
    // 秀丸マクロ空間に代入されている変数は、当然pythonの外から見える
    message(str(#c));
    
    freedll(#PY);
    
    PICTURE

.NET FrameWork を使った簡単なソース例

.NET FrameWorkを使って、ダイアログ表示

    #PY = loaddll( hidemarudir + @"\hmPy.dll" );
     
    #_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
    
    import clr                 # .NETが使えるようにする。
    import System              #  Systemのシンボルを読み込み
    clr.AddReferenceByPartialName('System.Windows.Forms')  # System.Windows.Forms を使えるようにする。
    
    System.Windows.Forms.MessageBox.Show( "秀丸からのメッセージ", "秀丸からのタイトル", System.Windows.Forms.MessageBoxButtons.YesNoCancel )
    
    )IRONPYTHON"
    );
    
    freedll(#PY);
    
    PICTURE

フォームを利用した簡単な例

    #PY = loaddll( hidemarudir + @"\hmPy.dll" );
    
    #_ = dllfuncw(  #PY, "DoString", R"IRONPYTHON(
    import clr
    clr.AddReferenceByPartialName('System.Windows.Forms')
    clr.AddReferenceByPartialName('System.Drawing')
    
    from System.Windows.Forms import *
    from System.Drawing import *
    
    class IronPythonForm(Form):
    
      def __init__(self):
        self.Text = 'こんにちわ'
        self.Size = Size(400, 200)
        self.btn = Button()
        self.btn.Location = Point(16, 16)
        self.btn.Width = 200
        self.btn.Text = "クリック"
        self.btn.Click += self.btn_Click
    
        self.count = 0;
    
        self.Controls.Add(self.btn)
    
      def btn_Click(self, sender, e):
        self.count += 1
        MessageBox.Show( "今開いているファイルは…\n" + hm.Macro.Var['filename2'] );
    
        hm.OutputPane.Output(str(self.count) + "\r\n")
    
    f = IronPythonForm()
    f.ShowDialog()
    
    )IRONPYTHON"
    );
    
    freedll( #PY );
    

その他解説

  • 左メニューに各解説を用意しました。

ライセンス

  • hmPy

    hmPyは、Apache License 2.0となります。

    ソースの場所

    • Githubにソースがあります。