最終更新日 2024-09-25

ソースや秀丸の機能との結び付き解説

概要

ソースの部分で重要部だけ解説

重要な部分

//---------------------------------------------------------------------------------------------------
// hwnHidemaru   : 秀丸のウィンドウハンドル
//
// pwszIn        : wchar_t* 型で 変換対象となっている文字列が全部渡ってくる。
//                 通常は秀丸エディタで現在編集中の「選択しているテキスト」が渡ってくることになる。
//                 秀丸マクロであれば、「filter関数」を使って第4引数で直接渡すことも可能。
//
// pszParamBuffer: これは自分で自由に自分で決める、パラメータみたいなもの。
//                 長さがcbParamBufferであり、
//                 パラメータが何も無ければ「全て0でクリア」された状態で渡ってくる。
//
//                 複数の使い道がある。
//                 ①まず、秀丸エディタの変換のメニューから選んだ場合は、空文字「""」相当で渡ってくる。
//                 ②「秀丸マクロのfilter文やfilter関数」で第3引数に文字列を渡した場合は、そのまま渡ってくる。
//                  この場合は、該当の秀丸マクロのファイル(.mac)の文字コードが不明なため、「英数字」だけが望ましい。
//
//                  通常は「0」と「1」の並びとすることが多い。自分自身で「何番めの文字はどういう意味に使う」と決めることになる。
//
//                  例えば、秀丸の「Sort変換モジュール」の場合は、
//                  fReverse     = pszParamBuffer[0] == '1' or '0';
//                  fIgnoreSpace = pszParamBuffer[1] == '1' or '0';
//                  fIgnoreCase  = pszParamBuffer[2] == '1' or '0';
//                  fRealNumber  = pszParamBuffer[3] == '1' or '0';
//
//                  を並べて、"1101" などといった形となっており、filter関数などで、そのように渡すことが可能である。
//
//                 ③パラメータを読み取るだけではなく、書き込んでおくことも可能。
//                  書き込んでおいたものは、「秀丸マクロのキー操作の記録」をすると、秀丸エディタがこのパラメータを覚えおり、
//                  「キー操作の再生」をすると、そのパラメータをpszParamBufferに渡した状態で、この関数を呼び出すことになる。
//
//                  このような仕組みがあることで、「マクロのキー操作時の記録」ではダイアログを出して値を選択し、
//                  「キー操作再生時」にはダイアログで選んだ値をそのまま使うといったことが可能となっている。
//
// cbParamBuffer : pszParamの秀丸本体側のバッファーサイズ。260。
//---------------------------------------------------------------------------------------------------
MACRO_DLL
HGLOBAL MyTestFunc( HWND hwndHidemaru, const wchar_t *pwszIn, char *pszParamBuffer, int cbParamBuffer ) {

  // まず、元のデータをwstring型で確保。
  wstring wstr_text = pwszIn;

  //---------------------------------------------------------------------------------------------------
  // ここで、いろいろ文字列を加工する
  //---------------------------------------------------------------------------------------------------

  // パラメータの最初の要素
  char mode = pszParamBuffer[0];

  switch (mode) {
  case NULL: {

    // 「pszParamBuffer」へと書き込んでおくと、
    // (※)「マクロ記録」による「キー再生」の際、pszParamBuffer[0]に'2'が入った状態で、秀丸がこの関数を呼んでくれる。
    // よって、「マクロのキー再生」時には「case '2'」となるので、「大文字」へと変換されることとなる。
    pszParamBuffer[0] = '2';

    // 小文字に変えてみる
    std::transform(wstr_text.begin(), wstr_text.end(), wstr_text.begin(), ::tolower);
    break;
  }

  case '1':{
    // 小文字に変えてみる
    std::transform(wstr_text.begin(), wstr_text.end(), wstr_text.begin(), ::tolower);
    break;
  }

  case '2':
    // 大文字に変えてみる
    std::transform(wstr_text.begin(), wstr_text.end(), wstr_text.begin(), ::toupper);
    break;
  }

  // デバッグモニターに出力(cp932を超える分は潰れる)
  OutputDebugStream(wstr_text);

  return utf16_to_hm_filter_global(wstr_text);
}

重要なのは、上記ソース部分だけです。

他はC/C++の基礎なので、
「変換モジュールの作り方がわからない」のではなく、
「C/C++を知らない」といったことになるため、
先にC/C++の入門書で勉強しましょう。

秀丸のメニューから実行した場合

秀丸マクロのfilter関数から実行した場合

この場合は、pszParamBufferへとパラメータを渡すことが出来ます。

キー操作の保存、キー操作の再生

範囲選択や、複数選択時

秀丸内部で選択文字列が複数に分割された後、
分割単位ごとに「MyTestFunc」が呼び出されます。
対象の分割された文字列はpwszInへと渡ってきます。

ここの挙動は少し独特ですが、pwszInの内容などをデバッグモニターなどに出力すると、
ハッキリと挙動がわかるので、確認してみてください。

読み取り専用・閲覧モード・上書き禁止モードでは、変換モジュールは実行されない!!

ここはとても要注意です。
変換モジュールはその性質上、テキストの内容が変更可能な状態でない限り、実行されません。
秀丸マクロのfilter文も無効となります。