秀丸マクロをハイライトする方法と検索の利用方法

このQ&Aのポイント
  • htmlタグで秀丸マクロをハイライトする方法を教えてください。
  • マクロ内で条件を区別する正規表現方法を教えてください。
  • 秀丸マクロの検索機能の利用方法を教えてください。
回答を見る
  • ベストアンサー

秀丸マクロをハイライトするマクロ

htmlタグで秀丸マクロをハイライトするマクロを作っています。 強調表示のファイルを見ながら作っています。 「if」 「else if」 「else」を上手に区別する正規表現方法を教えてください。 また、このようなマクロを作るときに役立ちそうな方法がありましたら教えてください。 このようなソースを if (条件式1) message "コメント1"; else if (条件式2) message "コメント2"; else if (条件式3) message "コメント3"; else message "コメント4"; このようにhtmlタグを付けていきます。 <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"; マクロはこんな感じです。 setcompatiblemode 0x0F; begingroupundo; replaceall "message" , "<span class=\"message\">message</span>" , regular, word; replaceall "if" , "<span class=\"if\">if</span>" , regular, word; replaceall "else_if" , "<span class=\"else_if\">else_if</span>" , regular, word; replaceall "else" , "<span class=\"else\">else</span>" , regular, word; if( ! result ) beep; endgroupundo 1; endmacroall; 単語の検索 http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/190_CmdSearch_WordSearch.html 検索(Ver8.04対応版) http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/070_Env_Search.html

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.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; } =========================== 以上です。

synchro-night
質問者

お礼

いろいろ 参考になるマクロソースありがとうございました。 正規表現が 難しいですね。 高度な 正規表現もあり よかったです。 いろいろ調べて 復習しています。

関連するQ&A

  • 秀丸のマクロについて

    すみません。。検索してもなかなか見つからないので詳しいかたどうぞ教えてくださいませんでしょうか(/_;)?? 秀丸のマクロで下記のようなHTMLの編集をしたいのですが 「◎◎◎◎◎」部分はそれぞれ異なる文字列が入ります。 マクロ上「◎◎◎◎◎」には正規表現でなんと入れればいいのでしょうか?? ------------------------------------------------------------ question "変換しますかっ?"; if(result ==yes ){ replaceallfast "<span class=\"★\"><strong>◎◎◎◎◎</strong></span><br>" , "<p class=\"★\"><strong>◎◎◎◎◎</strong></p>"; message "変換しました。"; } ------------------------------------------------------------ どうぞよろしくお願いいたします(T_T)

  • 秀丸マクロで 大文字を小文字に変換

    秀丸マクロで  テキストを選択範囲して ABCD マクロを実行すると テキストの文字を変えないで  $s = gettext(seltopx,seltopy,selendx,selendy); でテキストを$sに代入したのを $s = ABCD 小文字にするマクロを教えてください。 $s = abcd $s = gettext(seltopx,seltopy,selendx,selendy); filter "" , "ToLower", "$s"; message $s; filterを使って小文字にしようと思っているのですが どうも filterの指定がうまくいってないようです。 小文字になりません。 ヘルプを読んでも 例文がなくわからないのです。 他にも良い方法があれば教えてください。 秀丸は最新版です。 その他編集系文- filter文 http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemac/html/080_CmdStatement_Edit_filter.html 関数- filter( s1, s2, s3, s4 ) 関数 http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemac/html/070_Function_filter.html

  • 同時に複数重複する項目だけを絞り込ませたいです。

    3つの項目を絞り込む機能を実現したいです。 実現させたいことは、 チェックを1つ付けると、その項目だけしかないものを絞り込み、 チェックを2つ付けた場合は、その項目が両方あるものだけを絞りこみたいです。 現在は項目は3種類だけですが種類が増えても更新に負担がかからないようにしたい 試しましたが、チェックが2つ以上になると重複させて機能させることができませんでした。 アドバイスを頂けないでしょうか。 <html lang="ja"> <head> <script type="text/javascript"> function fff() { var elm = document.getElementById('test1'); var tag = document.getElementsByTagName('input'); var svalue1 = new Array(); var svalue2 = new Array(); var svalue3 = new Array(); var ccc; for(i=0, elmL=elm.children.length; i<elmL; i++){ var spanTAG = elm.children[i].getElementsByTagName('span'); svalue1[i] = new Array(); svalue2[i] = new Array(); svalue3[i] = new Array(); for(m=0, spanL=spanTAG.length; m<spanL; m++){ if(spanTAG[m].className == "span1"){ svalue1[i][m] = spanTAG[m].innerHTML; }else if(spanTAG[m].className == "span2"){ svalue2[i][m] = spanTAG[m].innerHTML; }else if(spanTAG[m].className == "span3"){ svalue3[i][m] = spanTAG[m].innerHTML; } if(tag[0].checked && !tag[1].checked && !tag[2].checked){num=1;}else if(tag[1].checked && !tag[0].checked && !tag[2].checked){num=2;}else if(tag[2].checked && !tag[0].checked && !tag[1].checked){num=3;}else if(tag[0].checked && tag[1].checked && !tag[2].checked){num=4;}else if(tag[0].checked && tag[2].checked && !tag[1].checked){num=5;}else if(tag[1].checked && tag[2].checked && !tag[0].checked){num=6;}else if(tag[0].checked && tag[1].checked && tag[2].checked){num=7;}else{num=8;} switch(num){ case 1: if(new RegExp(tag[0].value).test(svalue1[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[2].value).test(svalue3[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 2: if(new RegExp(tag[1].value).test(svalue2[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 3: if(new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 4: if(new RegExp(tag[0].value).test(svalue1[i][m]) && new RegExp(tag[1].value).test(svalue2[i][m]) && !new RegExp(tag[2].value).test(svalue3[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 5: if(new RegExp(tag[0].value).test(svalue1[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[1].value).test(svalue2[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 6: if(new RegExp(tag[1].value).test(svalue2[i][m]) && new RegExp(tag[2].value).test(svalue3[i][m]) && !new RegExp(tag[0].value).test(svalue1[i][m])){ elm.children[i].style.display = 'block'; }else{ elm.children[i].style.display = 'none'; } break; case 7: case 8: elm.children[i].style.display = 'block'; break; } } } } </script> </head> <body> <form action="#"> <ul> <li><input type="checkbox" name="c1" id="c1" value="aaa" onclick="fff()" /><label for="c1">aaa</label></li> <li><input type="checkbox" name="c2" id="c2" value="bbb" onclick="fff()" /><label for="c2">bbb</label></li> <li><input type="checkbox" name="c3" id="c3" value="ccc" onclick="fff()" /><label for="c3">ccc</label></li> </ul> </form> <div id="test1">  <div class="test2">   <span class="span3">ccc</span>   <span class="span2">bbb</span>   <span class="span1">aaa</span>   </div>  <div class="test2">   <span class="span3">ccc</span>   <span class="span1">aaa</span>  </div>  <div class="test2">   <span class="span2">bbb</span>   <span class="span1">aaa</span>  </div>  <div class="test2">   <span class="span3">ccc</span>  </div>  </body

  • 簡潔なJavaScriptで実現したい

    次のような、btnToggleというクラス名のdivタグがいくつかあるHTMLで、 それぞれクリックするとそれぞれの「開く/閉じる」が反転するという動きをさせたいです。 <div class="btnToggle"><a href="#"><span>+</span>開く</a> <div>AAA</div> </div> <div class="btnToggle"><a href="#"><span>+</span>開く</a> <div>BBB</div> </div> <div class="btnToggle"><a href="#"><span>+</span>開く</a> <div>CCC</div> </div>    : <div class="btnToggle"><a href="#"><span>+</span>開く</a> <div>XXX</div> </div> 下記のようなJavaScriptで実行してみたのですが、 いくつかのdivタグをそれぞれクリックすると、flgの値と現在の状態が入れ替わってしまいます。 クラス名が同じで、flgも一つの変数なので当たり前なのですが… <script type="text/javascript"> $(document).ready(function(){ var flg = "close"; $(".btnToggle").click(function(){ if(flg == "close"){ $(this).html("<span>-</span>閉じる"); flg = "open"; }else{ $(this).html("<span>+</span>開く"); flg = "close"; } }); }); </script> 私が考えられることは、classではなく、idで「btnToggle1」「btnToggle2」「btnToggle3」…などと定義し、 JavaScriptのプログラムを次のように書くしか思いつかないのですが、 これでは、我ながら間抜けなプログラムだなと思いました。 <script type="text/javascript"> $(document).ready(function(){ var flg1 = "close"; $(".btnToggle1").click(function(){ if(flg1 == "close"){ $(this).html("<span>-</span>閉じる"); flg1 = "open"; }else{ $(this).html("<span>+</span>開く"); flg1 = "close"; } }); var flg2 = "close"; $(".btnToggle2").click(function(){ if(flg2 == "close"){ $(this).html("<span>-</span>閉じる"); flg2 = "open"; }else{ $(this).html("<span>+</span>開く"); flg2 = "close"; } }); var flg3 = "close"; $(".btnToggle3").click(function(){ if(flg3 == "close"){ $(this).html("<span>-</span>閉じる"); flg3 = "open"; }else{ $(this).html("<span>+</span>開く"); flg3 = "close"; } });        :        : }); </script> 配列などを使えばもっと簡潔になるのでしょうか。 どうか教えてくださいますようお願い申し上げます。

  • 数値が 2 のべき乗かどうか調べるマクロ

    define した値や変数値が、2 のべき乗かどうかを 関数ではなくマクロで簡単に評価できる方法はありますか。 例) #define BUFFERSIZE (2048) // OK //#define BUFFERSIZE (2000) // NG #if !(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式) # error コンパイルエラーメッセージ #endif assert(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式); buffer[idx] = data; if (BUFFERSIZE が 2 のべき乗か調べる) idx = ++idx & (BUFFERSIZE - 1); else { idx = ++idx % BUFFERSIZE; // idx = (idx + 1) >= BUFFERSIZE ? 0 : (idx + 1); } 上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は どういうふうにすればいいでしょうか。 よろしくお願いします。

  • Excelから、Word起動 マクロ

    ExcelからWord起動のマクロを以下のように記述しました。 (1)Wordを起動、Word閉じるメッセージが出る (2)2回目Wordを閉じて、タスクマネージャに無い状態でも、Word閉じるメッセージが出る   GetObjectの戻り値が、Nothingにならない。 原因は、何でしょうか? Dim WdApp As Word.Application On Error Resume Next Set WdApp = GetObject(, "Word.Application") On Error GoTo 0 If WdApp Is Nothing Then Set WdApp = CreateObject("Word.Application") Else MsgBox "Wordを終了後に起動してください。", vbExclamation End If

  • JavaScript IFを利用した場合分けについて

    JavaScriptでIFを使って場合分けを記述する場合、 if(条件式) { document.write("○○○"); else { document.write("×××"); } } のように書くと思うのですが、この【if(条件式)】の条件式の部分に 数字のみを入れることは可能なのでしょうか?(質問1) http://www.tagindex.com/javascript/form/check1.html ↑のサイト(TAG Index)のソースを見たところ、 if(flag)~と書かれており。条件「式」ではありません。 プログラムの最初の方に var flag =0;とあるのでそれを条件式にするのかな? とも考えたのですが、変数の宣言を条件式に使うのは何かおかしいような気がします。 それに、flagが0の場合はelseに飛ぶのにflag 0が条件式のはつじつまがあわなくなってしまいます。 なぜここにflagが入るのでしょうか?(質問2) プログラムがどう動いているかはなんとなくわかるのですが、 if(flag)を書いたらなぜ成立するのか、文法の部分がわかりません。 どなたかご教授お願いいたします。

  • ハイライト表示をしたい

    2度目の投稿(前回の投稿 http://oshiete1.goo.ne.jp/qa5506744.html)になりますが、指定の文言を色を変えて目立つように(以下ハイライト表示)させたいと思っています 最初に作った物はタグの中(altの中)まで置換をしてしまい、HTMLがくずれるという始末・・・ そこでこのサイトで質問した所、以下のスクリプトを教えて頂きました ところがfirefoxだと動くのですが、IE(IE6しか入っていない環境で使いたい)では動きません 色々調べたところ「フレーム越しの要素コピーは,FFではできて,IEではできないらしい」というのが原因じゃないかという所まで辿り着きました まだjavascript初心者で勉強中な為、教えて頂いたスクリプトも全部理解している訳ではありませんが、どなたか解決方法を教えて頂けないでしょうか 何卒宜しくお願い致します 以下教えて頂いたスクリプト <!-- var str; function left_load(){ if(str){ search(left.document.getElementsByTagName("body")); } } function search(elm){ for(var i=elm.length-1;i>=0;i--){ if(elm[i].nodeName=="#text"){ var re=new RegExp(str,"g"); var ss=elm[i].nodeValue; var result = elm[i].nodeValue.indexOf(str); if(result>=0){ var result_str=ss.replace(re,"<span style=\"background:#77ff77;font-weight:bold\">"+str+"</span>"); var newElement = document.createElement("span"); newElement.innerHTML = result_str; elm[i].parentNode.replaceChild(newElement,elm[i]); } }else{ if(elm[i].hasChildNodes()){ search(elm[i].childNodes); } } } } // --> </script>

  • ワードの履歴情報を消すマクロ

    お世話になっております。ワード2000を使用しています。 大量のワードをPDFに変換しているのですが、ワードの履歴があり1件ずつ履歴のチェックを外しています。 最近自動マクロを使用し、開いたファイルのチェックを外すようにしているのですが、フォルダ内のファイル全てに関してチェックを外すマクロを作りたいのですが出来ますでしょうか?又はそのようなフリーソフトがあれば教えて下さい。 ちなみに自動マクロで作成したものは下記の通りです。 Sub Macro2() If ActiveWindow.View.SplitSpecial = wdPaneNone Then ActiveWindow.ActivePane.View.Type = wdPrintView Else ActiveWindow.View.Type = wdPrintView End If With ActiveDocument .TrackRevisions = False .PrintRevisions = False .ShowRevisions = False End With End Sub

  • 綺麗なコードとは

    C言語において綺麗なコードを書くには、 コメントや書式をどのように書いたら良いのか教えてください。 例えば if(条件){    処理; }else{    処理; } を if(条件){    処理; } else{    処理; } と書いてみるなど。 よろしくお願いします。

専門家に質問してみよう