- ベストアンサー
秀丸マクロをハイライトする方法と検索の利用方法
- htmlタグで秀丸マクロをハイライトする方法を教えてください。
- マクロ内で条件を区別する正規表現方法を教えてください。
- 秀丸マクロの検索機能の利用方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 ご提示の置換を行うマクロを当方で色々検証してみました。 暫定版ですが、その結果のマクロを掲載させて頂きます。 宜しければ検証してみて下さい。 ただし、正規表現等にまだ不充分な点があるかもしれません。 ご使用の環境で上手くいかない場合は、ご自身で色々と修正してみて下さい。 以下は、注意点です。 ■マクロにより置換を行う場合の検索&置換文字列の記述の注意点 ・マクロにより置換を行う場合、検索文字列及び置換文字列は、両端を "(ダブルクォーテーション)で括った文字列として指定する必要があります。 そのため、指定文字列内にダブルクォーテーションが含まれている場合、 " → \" のような置き換えが必要になります。 ・また、指定文字列内に正規表現のエスケープ文字を含む場合、間違って マクロで扱う文字列用のエスケープ文字として認識されるのを防ぐため、 \s → \\s のような置き換えが必要になります。 ・下記は、今回の置換を行う場合の手動置換とマクロ置換での指定文字列 の違いを示した例です。 1.「置換ダイアログ」にて手動置換する場合の指定文字列の例 a)if ブロック 検索文字列: (?<=^\s*)(if)(\s*\(.+) 置換文字列: <span class="if">\1</span>\2 b)else if ブロック 検索文字列: (?<=^\s*}?\s*)(else\s+if)(\s*\(.+) 置換文字列: <span class="else_if">\1</span>\2 c)else ブロック 検索文字列: (?<=^\s*}?\s*)(else(?!\s+if))($|\s+|{|/\*|//|(#|\$)[a-zA-Z]) 置換文字列: <span class="else">\1</span>\2 d)message 文 検索文字列: (?<=^\s*)(message)(\s+.*) 置換文字列: <span class="message">\1</span>\2 2.上記1の文字列をマクロ用の検索&置換文字列に置き換えた例 a)if ブロック 検索文字列: "(?<=^\\s*)(if)(\\s*\\(.+)"; 置換文字列: "<span class=\"if\">\\1</span>\\2"; b)else if ブロック 検索文字列: "(?<=^\\s*}?\\s*)(else\\s+if)(\\s*\\(.+)"; 置換文字列: "<span class=\"else_if\">\\1</span>\\2"; c)else ブロック 検索文字列: "(?<=^\\s*}?\\s*)(else(?!\\s+if))($|\\s+|{|/\\*|//|(#|\\$)[a-zA-Z])"; 置換文字列: "<span class=\"else\">\\1</span>\\2" d)message 文 検索文字列: "(?<=^\\s*)(message)(\\s+.*)"; 置換文字列: "<span class=\"message\">\\1</span>\\2"; ■その他の注意点 1)今回のマクロでは、置換後のテキストの行末には、<br>(改行タグ)は付加 していません。 ですので、ブラウザの表示上で改行させたい場合は、改行させたい部分の テキストを<pre>~</pre>のタグで囲むか、または、行末に<br>タグを挿入 する必要があります。 2)今回は、if文とmessage文のみの置換になりますが、他の制御文・命令文 などにもスタイルタグを付加する場合は、ご自身でマクロにその置換処理を 追加してみて下さい。 下記にマクロを掲載致します。 ■サンプルマクロ ===↓ここから==================== //================================================ // 秀丸マクロの制御文へのスタイルタグ挿入(暫定版) //------------------------------------------------ // ■タグ挿入対象の制御文&命令文 // 1. if // 2. else if // 3. else // 4. message //================================================ //== 前処理 == setcompatiblemode 0x0F; begingroupundo; // タイトルバーに"置換中"を表示 title "== 置換中 =="; // 画面の書き換えを禁止(※処理時間軽減のため) disabledraw; // 置換個数のクリア #cnt = 0; //== [if]の置換 == $s1 = "(?<=^\\s*)(if)(\\s*\\(.+)"; $s2 = "<span class=\"if\">\\1</span>\\2"; replaceallfast $s1, $s2, regular, word, casesense; #cnt = #cnt + result; //== [else if]の置換 == $s1 = "(?<=^\\s*}?\\s*)(else\\s+if)(\\s*\\(.+)"; $s2 = "<span class=\"else_if\">\\1</span>\\2"; replaceallfast $s1, $s2, regular, word, casesense; #cnt = #cnt + result; //== [else]の置換 == $s1 = "(?<=^\\s*}?\\s*)(else(?!\\s+if))($|\\s+|{|/\\*|//|(#|\\$)[a-zA-Z])"; $s2 = "<span class=\"else\">\\1</span>\\2"; replaceallfast $s1, $s2, regular, word, casesense; #cnt = #cnt + result; //== [message]の置換 == $s1 = "(?<=^\\s*)(message)(\\s+.*)"; $s2 = "<span class=\"message\">\\1</span>\\2"; replaceallfast $s1, $s2, regular, word, casesense; #cnt = #cnt + result; // 画面の書き換えを許可 enabledraw; // タイトルバーを元に戻す title 0; //== 置換個数の表示 == beep; if (#cnt > 0) { message str(#cnt) + "個の置換を行いました。"; } else { message "置換した文字列はありません。"; } //== 後処理 == endgroupundo 1; endmacroall; ===↑ここまで==================== ■マクロの実行例 ◎置換前 =========================== if (条件式1) message "コメント1"; else if (条件式2) message "コメント2"; else if (条件式3) message "コメント3"; else message "コメント4"; =========================== ◎置換後 =========================== <span class="if">if</span> (条件式1) <span class="message">message</span> "コメント1"; <span class="else_if">else if</span> (条件式2) <span class="message">message</span> "コメント2"; <span class="else_if">else if</span> (条件式3) <span class="message">message</span> "コメント3"; <span class="else">else</span> <span class="message">message</span> "コメント4"; =========================== ■参考まで 上記で置換したテキストに<pre>タグ追加と下記スタイルシート(*.css)の 挿入指定でHTML化し、ブラウザで表示させた際の画面キャプチャを添付 しました。 ◎スタイルシート例 =========================== .if { color: black; font-weight: bold; } .else_if { color: black; font-weight: bold; } .else { color: black; font-weight: bold; } .message { color: blue; font-weight: bold; } =========================== 以上です。
お礼
いろいろ 参考になるマクロソースありがとうございました。 正規表現が 難しいですね。 高度な 正規表現もあり よかったです。 いろいろ調べて 復習しています。