ソースの部分で重要部だけ解説
//--------------------------------------------------------------------------------------------------- // 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として渡ってきます。
pszParamBufferが指すバッファーは、長さが、cbParamBuffer 分あります。
秀丸の変換のメニューから実行した場合は、
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へとパラメータを渡すことが出来ます。
// 複数選択や範囲選択に対応した関数の呼び出し方をしてほしい setcompatiblemode 0x100000; // "1"の部分がpszParamBufferとして渡ってくる filter hidemarudir + "\\hmFilterMicro.hmf", "MyTestFunc", "1";
// 複数選択や範囲選択に対応した関数の呼び出し方をしてほしい setcompatiblemode 0x100000; // "abCああ"の部分がpwszInとして渡ってくる。 // 変換結果が$strに返る。 $str = filter( hidemarudir + "\\hmFilterMicro.hmf", "MyTestFunc", "2", "abCああ"); message($str);
pszParamBufferが指すバッファーは、長さが、cbParamBuffer 分あります。
pszParamBuffer内のバッファーは先に全て0でクリアされてから、
filter文で第3引数の文字列がパラメータとしてセットされます
setcompatiblemode 0x100000;
とすることで、範囲選択や複数選択にfilter文を対応させることが出来ます。
(厳密には、下から6番目のbitを1にすると対応となります)
以下の部分のソースは、意味がわからにくいハズです。
// 「pszParamBuffer」へと書き込んでおくと、 // (※)「マクロ記録」による「キー再生」の際、pszParamBuffer[0]に'2'が入った状態で、秀丸がこの関数を呼んでくれる。 // よって、「マクロのキー再生」時には「case '2'」となるので、「大文字」へと変換されることとなる。 pszParamBuffer[0] = '2';
試しに、
秀丸のメニューより「マクロ」→「キー操作の記録開始/終了」をして記録を開始、
適当に秀丸エディタ上の「文字列」を選択した状態で、「編集」→「変換」→「日本語でのこの変換モジュール名」を実行してみて下さい。
その後、「マクロ」→「キー操作の記録開始/終了」をして、記録を終了。
「マクロ」→「キー操作の保存」としてみます。
すると以下のような内容となります。
setcompatiblemode 0x10000F; filter "HmFilterMicro.hmf" , "MyTestFunc" , "2";
hmf側から、記録マクロへと"2"の部分をpushする働きをするのが、pszParamBufferへと書き込んだことによる効果です。
このような機能があることで、
マクロを記録する際には「ダイアログを出して、ユーザーに何らかの選択項目を選んでもらい」
マクロを再生する際に、「選んでもらったパラメータを再現した状態」で実行することが出来ます。
実際にマクロファイル(.mac)へと保存しなくとも、
「キー操作操作の記録」→「変換」→「キー操作操作の終了」→保存はせずに→「キー操作の再生(リピート再生も同様)」
といった操作でも、パラメータが"2"の状態で実行されることを確認してください。
秀丸内部で選択文字列が複数に分割された後、
分割単位ごとに「MyTestFunc」が呼び出されます。
対象の分割された文字列はpwszInへと渡ってきます。
ここの挙動は少し独特ですが、pwszInの内容などをデバッグモニターなどに出力すると、
ハッキリと挙動がわかるので、確認してみてください。
ここはとても要注意です。
変換モジュールはその性質上、テキストの内容が変更可能な状態でない限り、実行されません。
秀丸マクロのfilter文も無効となります。