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

  • 概要

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

  • 重要な部分

    //---------------------------------------------------------------------------------------------------
    // 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++の入門書で勉強しましょう。

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

    • pwszInの状態

      秀丸エディタ上で選択しているテキストが、pwszInとして渡ってきます。

    • pszParamBufferの状態

      • pszParamBufferは固定長のバッファー(へのポインタ)である

        pszParamBufferが指すバッファーは、長さが、cbParamBuffer 分あります。

      • メニューからの選択時は0クリア

        秀丸の変換のメニューから実行した場合は、
        pszParamBufferのバッファーの内容は、 全て「0クリア」した状態(ZeroMemoryした状態)で渡ってきます。
        というわけで、pszParamBufferを文字列としてとらえた場合は、「空文字(="")」となります。

        
        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でパラメータを受け取ったり、書き込んだり出来る

        詳細は、後述されています。

    • 秀丸上でテキストを選択していない場合

      テキストを選択していない場合は、そもそも実行出来ません。

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

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

    • filter文の場合

      // 複数選択や範囲選択に対応した関数の呼び出し方をしてほしい
      setcompatiblemode 0x100000;
      
      // "1"の部分がpszParamBufferとして渡ってくる
      filter hidemarudir + "\\hmFilterMicro.dll", "MyTestFunc", "1";
      
    • filter関数の場合

      // 複数選択や範囲選択に対応した関数の呼び出し方をしてほしい
      setcompatiblemode 0x100000;
      
      // "abCああ"の部分がpwszInとして渡ってくる。
      // 変換結果が$strに返る。
      $str = filter( hidemarudir + "\\hmFilterMicro.dll", "MyTestFunc", "2", "abCああ");
      message($str);
      
    • pszParamBufferの状態

      • pszParamBufferは固定長のバッファー(へのポインタ)である

        pszParamBufferが指すバッファーは、長さが、cbParamBuffer 分あります。

      • pszParamBufferは0クリアの後、パラメータがセットされる

        pszParamBuffer内のバッファーは先に全て0でクリアされてから、
        filter文で第3引数の文字列がパラメータとしてセットされます

    • 範囲選択や、複数選択への対応

      setcompatiblemode 0x100000;

      とすることで、範囲選択や複数選択にfilter文を対応させることが出来ます。
      (厳密には、下から6番目のbitを1にすると対応となります)

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

    • pszParamBufferへの書き込み

      以下の部分のソースは、意味がわからにくいハズです。

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

      試しに、

      • キー記録開始

        秀丸のメニューより「マクロ」→「キー操作の記録開始/終了」をして記録を開始、

      • 変換の実行

        適当に秀丸エディタ上の「文字列」を選択した状態で、「編集」→「変換」→「日本語でのこの変換モジュール名」を実行してみて下さい。

      • キー記録終了

        その後、「マクロ」→「キー操作の記録開始/終了」をして、記録を終了。

      • ファイルに保存

        「マクロ」→「キー操作の保存」としてみます。

        すると以下のような内容となります。

          setcompatiblemode 0x10000F;
          filter "HmFilterMicro.dll" , "MyTestFunc" , "2";
        

        dll側から、記録マクロへと"2"の部分をpushする働きをするのが、pszParamBufferへと書き込んだことによる効果です。

    • この機能は何に使えるのか

      このような機能があることで、

      • 記録時に値を選択

        マクロを記録する際には「ダイアログを出して、ユーザーに何らかの選択項目を選んでもらい」

      • 再生時にはその値を利用する

        マクロを再生する際に、「選んでもらったパラメータを再現した状態」で実行することが出来ます。

    • マクロファイルに保存しなくてもOK

      実際にマクロファイル(.mac)へと保存しなくとも、
      「キー操作操作の記録」→「変換」→「キー操作操作の終了」→保存はせずに→「キー操作の再生(リピート再生も同様)」
      といった操作でも、パラメータが"2"の状態で実行されることを確認してください。

  • 範囲選択や、複数選択時

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

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

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

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