とりあえず日記

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

psearch

2011/06/19 追記
マクロを高速化しました。
id:ohtorii:20110619:1308454833

秀丸エディタで動作するpsearchマクロです。
検索結果をポップアップ表示して選択した位置に移動できます。

psearchマクロのソース

/*psearch.mac

【これはなに】
検索結果をポップアップ表示します。
(xyzzyのpsearchに相当するマクロです。)


【動作】
選択文字列を検索してポップアップ表示します。
選択文字列がなければ単語選択してから検索します。


【オリジナルの作者】
秀丸エディタスレ Part30
178 :名無しさん@お腹いっぱい。 :2010/10/14(木) 02:08:50 ID:7v+i/hHB0 (2 回発言)


【改変 by ohtorii】
*ポップアップ表示の改良
    ・結果に行番号を追加しました。
    ・検索結果から重複する行を取り除きました。
    ・検索開始した位置に矢印を表示するようにしました。
*/

$old_searchbuffer = searchbuffer;
#old_searchoption = searchoption;
call Main;
setsearch $old_searchbuffer, #old_searchoption;
endmacro;


Main:
    #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;
    }else{
        searchdown2 $word;
    }
    hilightfound 1;
    #cur_pos_index = -1;
    #prev_line_no = -1;
    while (result && #i < 30) {
        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:
    if(1){
        //タブは空白文字に変換してから返す
        $$str="";
        golinetop2;
        while(1){
            if(unicode==0x09){
                $$str = $$str + "    ";
            }else if((unicode==0x0a) || (unicode==0x0d) || (unicode==-1)){
                return $$str;
            }else{
                $$str = $$str + unichar(unicode);
            }
            right;
            if(! result){
                return $$str;
            }
        }
    }else{
        escape;
        golinetop2;
        beginsel;
        golineend2;
        endsel;
        return gettext2(seltopcolumn, seltoplineno, selendcolumn, selendlineno);
    }