以前に書いたマクロを高速化しました。
id:ohtorii:20110312:1300105563
ファイルサイズが大きい時に、メニューが表示されるまで延々と待たされていたのを、一瞬で表示出来るようにしました。
どんだけ、無駄な処理をしていたんだと・・・>自分。
GitHub
右上のダウンロードボタンを押してzipを選択)
https://github.com/ohtorii/psearch
ソース
/* psearch.mac 検索結果をポップアップ表示する秀丸マクロ。 (xyzzyのpsearchに相当するマクロです。) 【動作】 選択文字列を検索してポップアップ表示します。 選択文字列がなければ単語選択してから検索します。 【オリジナルの作者】 秀丸エディタスレ Part30 178 :名無しさん@お腹いっぱい。 :2010/10/14(木) 02:08:50 ID:7v+i/hHB0 (2 回発言) 【改変 by ohtorii】 ポップアップ表示の改良 ・結果に行番号を追加しました。 ・検索結果から重複する行を取り除きました。 ・検索開始した位置に矢印を表示するようにしました。 【注意】 田楽DLLが必要です。 http://www.ceres.dti.ne.jp/~sugiura/ 田楽DLL Ver.3.20で動作することを確認していますが、多分ver2.xx以降なら動くと思います。 【連絡先】 ohtorii http://d.hatena.ne.jp/ohtorii/ https://github.com/ohtorii 【履歴】 2011/06/19 高速化(10秒の処理時間が一瞬に。10MBのXMLでテスト) 2011/03/12 公開 */ //検索結果を幾つ表示するか。(好みで変更して下さい) #g_max_num = 100; //////////////////////////////////////////////////////////////////////////// // マクロ本体 //////////////////////////////////////////////////////////////////////////// $g_searchbuffer = searchbuffer; #g_searchoption = searchoption; call Main; setsearch $g_searchbuffer, #g_searchoption; endmacro; Main: call LoadDengaku; if(! ##return){ return false; } #old_lineno = lineno; #lineno[-1] = lineno; #column[-1] = column; #search_word = false; if(! selecting){ selectword; #search_word=true; } $word = gettext(seltopx, seltopy, selendx, selendy); if(0==strlen($word)){ return ; } disabledraw; gofiletop; if(#search_word){ searchdown2 $word, word,nocasesense,noregular,nohilight; }else{ searchdown2 $word,nocasesense,noregular,nohilight; } hilightfound 1; #cur_pos_index = -1; #prev_line_no = -1; while (result && (#i < #g_max_num)) { if(lineno != #prev_line_no){ if(lineno == #old_lineno){ #cur_pos_index = #i; $mark = "→"; }else{ $mark = " "; } call GetLineStr; $line_str = $$return; $m[#i] = $mark + str(lineno) + ": " + $line_str; #lineno[#i] = lineno; #column[#i] = column; } #i = #i + 1; #prev_line_no = lineno; finddown; } movetolineno #column[-1] + 1, #lineno[-1]; enabledraw; menuarray $m, #i; if (result){ if(#cur_pos_index != (result-1)){ #r = result-1; disabledraw; movetolineno #column[#r] + 1, #lineno[#r]; //カーソルを画面中心にする //enabledraw y - (windowheight/2); } } return ; GetLineStr: escape; golinetop2; beginsel; golineend2; endsel; $$text = gettext2(seltopcolumn, seltoplineno, selendcolumn, selendlineno); //タブ文字を空白文字へ変換する。 $$text = dllfuncstr("GSUB", $$text, "\t", " ", -1); return $$text; LoadDengaku: //田楽DLLをロード loaddll ( hidemarudir + "\\DengakuDLL.dll" ); if ( !result ){ message "田楽DLLをロードできませんでした。"; return false; } // //田楽DLLのバージョンチェック $dllver = leftstr ( dllfuncstr("GETVERSION") ,1 ) + rightstr ( dllfuncstr("GETVERSION") ,2 ); if ( val ( $dllver ) <= 204 ) { message "このマクロの実行には Ver2.04 以降の田楽DLLが必要です。"; freedll; return false; } return true;