長大文字列を秀丸エディタに反映する

  • 概要

    秀丸マクロでは、「変数の合計のメモリ使用量」が制限されています。
    (デフォルトでは1M)
    このため、長大な文字列をhmPy内で構築した場合に、これを秀丸エディタへと反映するには面倒な手順が必要でした。

    しかし、秀丸エディタ v8.30以降では、改善されたため、以下のような工夫をすることで、この制限を回避する手段があります。

  • 長大文字列の秀丸本体への反映

    秀丸エディタ v8.30以降では、

    • 一時変数を利用しなければ、何かの関数の結果を、別の関数等の引数へと渡した際、 メモリ制限を受けない

    ようになっています。
    この性質を利用して、

    #PY = loaddll( hidemarudir + @"\hmPY.dll" );
    
    if ( !#PY ) {
        message("hmPy.dllが導入されていません");
        endmacro;
    }
    
    #_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
    totalstring = "なんらかの手段によって、長大な文字列を構成"  # 現在のアクティブな(同じプロセスの)全テキストを取得
    )IRONPYTHON"
    );
    
    // 全て選択し
    selectall;
    // 秀丸エディタへと挿入する。この際に変数を介することなく、「dllfuncstrw」の返り値をそのまま引数として渡すことが重要。
    insert dllfuncstrw( #PY, "GetStrVar", "totalstring" );
    
    freedll( #PY );
    

    dllfuncstrwの返り値を一時変数で受け取らないことが重要です。
    これにより、秀丸に存在する「変数のメモリ制限」という制約を受けなくて済むため、
    hmPyで長大な文字列を生成したものをそのまま秀丸へと反映できます。

    例えば、次のようにしてしまうと、秀丸の「変数のメモリ制限(1つのマクロ内で使える全ての変数の合計量のメモリの制限)」の影響を受けてしまいます。

    // 全て選択し
    selectall;
    // $retのように変数として受け取ってしまうと、秀丸マクロ自体が持つ「変数のメモリ制限」にひっかかる可能性があるため、長大な文字列を取り扱えなくなる。
    $ret = dllfuncstrw( #PY, "GetStrVar", "totalstring" );
    insert $ret;
    
    freedll( #PY );
    
  • 長大文字列とUnicode

    文章が長大化すればするほど、cp932(sjis)では取り扱えない文字が混入する可能性が高まります。
    そういった場合は、文字コードの指定で対応すると良いでしょう。