filesearchマクロ完成No.16396
inouen さん 04/01/11 19:31
 
ファイル名を指定してtagsファイルのサーチ範囲と同じdirectoryから
ファイルをサーチし、開くマクロを作成しました。
この機能はVer.4.04ではまだ公開されていない新しく追加していただいた
機能を使用しています。

キー割当てに設定しておけば ダイレクトタグジャンプと同様の使い勝手で
include file, import file, データ構造のみでtagsファイルにentryが
作成されないjava ファイル等を直接開くことができます。

//指定String名(.*)のファイルを現在のdirectory,
//tags-file directory, tags-file's subdirectoryをサーチし開く
//Ver4.10betaで動作確認: Ver4.04正式版ではサポート未の機能を使用

//現在のgrep情報セーブ
$svfile=grepfilebuffer;         //検索するファイル
#svopt=searchoption;            //検索条件フラグ
$svbuf=searchbuffer;

//検索ファイル名取得
if(selecting==0) selectword;    //範囲選択してなければ単語取得

$searchfile = gettext(seltopx,seltopy,selendx,selendy);

if(!result) goto last;

if(strstr($searchfile,".")==-1) $searchfile=$searchfile+".*";

// message $searchfile;

$dir=directory;                 //現在のファイルのフォルダ
$dir0=$dir;

//検索実行
#i = 0;
while(1) {
    grep ".*",$searchfile,$dir,casesense,subdir,filelist,regular,fullpath;
    if (result>0)   break;
nextdir:
    $tagf=gettagsfile(#i);  //秀丸tags宣言ファイル名取出し
    call extractdir;
    #i=#i+1;
    if($dir=="")    break;
    if($dir==$dir0) goto nextdir;
}

#h=hidemaruhandle(0);
if(result==1) goto found1;  //1個のみ検出
if(result==0) goto last;  //ファイルなし

//2個以上検出、不要ファイルタイプのものを削除
//他に不要のものがあれば適宜追加のこと。
call filter "class(";
call filter "obj(";
call filter "exec(";

goscreenend;
// 2個以上の場合、ファイル検索結果表示のみ
if (lineno!=2) goto last;

up;
golinetop;

//1個のファイルのみ見つかったので タグジャンプ自動実行
found1:
tagjump;
//タグジャンプに成功したら検索結果ウィンドウを閉じる

if(result==yes)
    closehidemaruforced #h;

last:
setsearch     $svbuf,#svopt;
setgrepfile   $svfile;
endmacro;

extractdir:             //最後の"\tags"部分削除
    ##j=strlen($tagf);  //(名前はtagsのみと考える)
    if(##j<9) {         // "c:\d\tags" : 最小9文字要
        $dir="";        //ドライブ直接指定は不可
        return;
    }
    $dir=leftstr($tagf,##j-5); // "\tags" 削除
    return;


//  obj, class, exec 等の不要ファイル行を削除する
filter:
    goscreentop;
loop1:
    searchdown $$1;
    if (result!=0) {
  golinetop;
  deleteline;
  goto loop1;
 }
 return;

//  複数ファイル検出された場合、開きたいファイルの行に
// カーソルを合わせ、次のマクロを実行すると良い。
//  (grep 結果windowが後に残らない)
// #handle=hidemaruhandle(0);
// tagjump;
// if(result) closehidemaru #handle;

[ ]