とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

psearchを高速化した。

以前に書いたマクロを高速化しました。
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;