/* * Find In File v0.3 * Searches for a [regex] pattern inside all files * matching in going folders deep. * LtGuide - 31 Oct 2004 * * v0.3 fixed depth (some sorta fluke with certain filemasks) * initial dialog focus * v0.2 added config dialog * v0.1 initial release with file handling, * converted from simple $read alias with no settings */ /* * How to use: * Load script into mIRC (at least v6.1x) * using, for example, `/load -rs fif.mrc' * or `/load -rs "d:\unzipped files\fif\fif.mrc"' * Accept initialization warning (or not, doesn't matter) * The `/fif' command opens the FIF window and prints what you do. * * Hint: You can double-click on the file paths that are printed as having * matched your search. They will open in your default editor. * * To unload, select Unload from Menubar or Status Window, * select Unload from inside the Remote Editor (while looking at fif.mrc), * or `/unload -rs fif.mrc' * Upon unloading the script, the FIF window will be closed and your * directory and file mask histories (from config dialog) will be deleted. */ /* * /fif [-r] [pattern] */ alias fif { fif.default var %dir = $gettok($hget(fif,dir.0),2-,32) var %depth = $hget(fif,depth) var %filemask = $gettok($hget(fif,filemask.0),2-,32) if (!$window(@fif)) window -nek0 @fif if ($1) { window -n @fif if ($1 == -r) && (!$2) echo @fif error: specified regex search, but no search terms else { hadd fif switch -w hadd fif seek $1- if ($1 == -r) { hadd fif switch -r hadd fif seek $2- } echo @fif $chr(2) echo @fif searching all %filemask files in $+(",%dir,") $iif(%depth,and %depth $fif.s(level,%depth) deep) ... var %fopen = $fopen(0) if (%depth) var %c = $findfile(%dir,%filemask,0,%depth,fif.scan " $+ $1-") else var %c = $findfile(%dir,%filemask,0,fif.scan " $+ $1-") echo @fif $chr(2) echo @fif %c file $+ $iif(%c != 1,s) scanned $iif($fopen(0) > %fopen,( $+ $ifmatch partial $fif.s(listing,$ifmatch) $+ ; use narrower search terms)) .fclose fif/* hdel fif switch hdel fif seek } window -a @fif } elseif ($active != @fif) { if (!$line(@fif,0)) { echo @fif Type in your search terms and press enter. To use regex, -r must be the first word you type. echo @fif Right-click with your mouse to see options. Config option may also be initiated by /fif.config (or /.fif.config for the dialog). echo @fif config setting: search all %filemask files in $+(",%dir,") $iif(%depth,and %depth $fif.s(level,%depth) deep) } window -a @fif } } /* * fif.scan */ alias -l fif.scan { var %fh = fif/ $+ $replace($1-,$chr(32),|) var %seek = $hget(fif,switch) %fh $hget(fif,seek) .fopen %fh $1- .fseek %seek if (!$feof) { echo @fif $chr(2) echo -c highlight @fif $+([,$nopath($1-),]) $mid($1-,2,-1) while (!$feof) { echo @fif $fread(%fh) .fseek %seek } } .fclose %fh } /* * /fif.config > [dir] > [depth] > [filemask] */ alias fif.config { if (!$show) dialog $iif($dialog(fif),-v,-m) fif fif else { fif if ($1) { tokenize 62 $1- fif.latest dir $gettok($1,1-,32) if ($gettok($2,1-,32) != $null) hadd fif depth $2 fif.latest filemask $gettok($3,1-,32) var %dir = $gettok($hget(fif,dir.0),2-,32) var %depth = $hget(fif,depth) var %filemask = $gettok($hget(fif,filemask.0),2-,32) echo @fif config: search all %filemask files in $+(",%dir,") $iif(%depth,and $ifmatch $fif.s(level,$ifmatch) deep) } else echo @fif /fif.config > [dir] > [depth] > [filemask] if ($active != @fif) window -a @fif } } /* * fif.latest <'dir'|'filemask'> */ alias -l fif.latest { if ($2-) && ($1- != $hget(fif,$1. $+ 0)) { var %l = $gettok($hfind(fif,$1-,1).data,2,46) if (!%l) %l = 9 while (%l > 0) { if ($hget(fif,$1. $+ $calc(%l - 1))) { hadd fif $1. $+ %l $ifmatch } dec %l } hadd fif $1. $+ 0 $1- } } /* * fif.s */ alias -l fif.s return $1 $+ $iif($2 != 1,s) /* * fif.dir */ alias -l fif.dir return " $+ $scriptdirfif.conf" /* * fif.default */ alias -l fif.default { if (!$hget(fif)) { hmake fif 3 if ($isfile($fif.dir)) hload -i fif $fif.dir fif } if (!$hget(fif,dir.0)) hadd fif dir.0 dir $mircdir if ($hget(fif,depth) == $null) hadd fif depth 0 if (!$hget(fif,filemask.0)) hadd fif filemask.0 filemask *.* } /* * fif.dialog.init */ alias -l fif.dialog.init { fif.default fif.dialog.latest dir 3 did -a fif 5 $hget(fif,depth) fif.dialog.latest filemask 8 } /* * fif.dialog.latest <'dir'|'filemask'> */ alias fif.dialog.latest { var %l = 0 while ($hget(fif,$1. $+ %l)) { did -a fif $2 $gettok($ifmatch,2-,32) inc %l } did -c fif $2 1 } menu @fif { Clear:clear @fif - Config:.fif.config - Close:window -c @fif } menu menubar,status { Find In File .$iif($window(@fif),Close):window -c @fif .$iif(!$window(@fif),Open):fif .- .$iif($line(@fif,0),Clear):clear @fif .- .Config:.fif.config .- .Unload:if ($input(Are you sure you want to unload Find In File?,8,Find In File)) unload -rs $+(",$script,") } on *:LOAD:{ if ($version < 6.1) echo -s Find In File requires mIRC v6.1x (file handling) echo -s Find In File options in Menubar and Status Window (/fif) } on *:UNLOAD:{ window -c @fif hfree -w fif if ($isfile($fif.dir)) .remove $fif.dir } on *:EXIT:{ if ($hget(fif)) hsave -oi fif $fif.dir fif } on ^*:HOTLINK:*:@fif:{ if ([*] *:\* iswm $hotline) && ([*] !iswm $1) return halt } on *:HOTLINK:*:@fif:{ run $+(",$gettok($hotline,2-,32),") } on *:INPUT:@fif:{ if (/* !iswm $1) || ($ctrlenter) { fif $1- } } on *:DIALOG:fif:INIT:0:{ fif.dialog.init did -f fif 10 } on *:DIALOG:fif:SCLICK:2:{ fif.default did -ic fif 3 1 $$sdir($iif($did(3),$ifmatch,$gettok($hget(fif,dir.0),2-,32)),Select base directory for searching) } on *:DIALOG:fif:SCLICK:9:{ beep fif.config > $did(3) > $did(5) > $did(8) did -r fif 3,5,8 fif.dialog.init } dialog -l fif { title "Find In File" size -1 -1 134 56 option dbu text "The directory to start searching from:", 1, 2 2 94 6 button ">>", 2, 120 2 12 6 combo 3, 2 10 130 46, size edit vsbar drop text "Search this many folders deep into the directory:", 4, 2 22 116 6 edit "", 5, 122 22 10 8 text "Files masks to look at:", 6, 2 32 56 6 text "(supports wildcards: * and ?)", 7, 2 38 70 6 combo 8, 76 32 56 46, size edit vsbar drop button "Apply", 9, 84 46 22 8 button "Close", 10, 108 46 22 8, cancel }