#!/usr/bin/perl use File::Basename; use Curses; # additianal directories to look in $spath = ''; # number of matches displayed $rows = 24; # holds matches $dbfile = $ENV{HOME}.'/.qqrc'; # matches you've used before (will be displayed first) $histfl = $ENV{HOME}.'/.qqhistory'; $version = "qq v0.01"; $help = <$dbfile"; open G, "<$histfl"; @G = ; for $i ( split(/:/, $ENV{PATH}), split(/ /, $spath) ) { for $j (<$i/*>) { chomp($k = basename($j)); next if grep(/^\Q$k\E$/,@G); next if $seen{$k}++; push(@a, basename($j)); } } print F join("\n", sort @a); close F; } if( @ARGV[0] eq "-f" ) { mkdb(); exit; } if( @ARGV[0] eq "-h" ) { print $help; exit; } initscr(); noecho(); keypad(1); if( ! -e $dbfile ) { printw("creating $dbfile ..."); refresh(); mkdb(); } clear(); printw($msg); refresh(); open F, "<$dbfile"; open G, "<$histfl"; @a = (,); close F; close G; while( $ch = getch() ) { # keypresses if( $ch eq "\n" ) { last; } elsif( $ch eq KEY_DOWN || $ch eq KEY_RIGHT ) { $j++; } elsif( $ch eq KEY_UP || $ch eq KEY_LEFT ) { if( $j ) { $j--; } else { $j = @prg - 1; } } elsif( $ch eq "" ) { endwin(); exit; } elsif( $ch eq KEY_BACKSPACE ) { if( $cmd[$i] ) { chop($cmd[$i]); } elsif( $i ) { $i--; } $j = 0; } elsif( $ch eq " " ) { chomp($cmd[$i++]); $j = 0; } elsif( $ch eq "\t" ) { chomp($cmd[$i++] = $prg[$j]); $j = 0; } else { $cmd[$i] .= $ch; $j = 0; } # matches clear(); printw(join(" ", @cmd)."\n"); if( $cmd[$i] ) { $j = 0 if $j == @prg; @prg = grep( /$cmd[$i]/i, @a); $l = $rows + $j; $k = $l - $rows; @slice = @prg[$k..$l]; printw(">$slice[0]"); for ($m=1;$m<=@slice;$m++) { printw(" $slice[$m]"); } } refresh(); } # sort out files open G, "<$histfl"; sort(@G = ); close G; open F, ">$dbfile"; open G, ">>$histfl"; for $a (@a) { chomp($a); if( grep(/^\Q$a\E$/, @cmd) ) { next if grep(/^\Q$a\E$/, @G); print G $a."\n"; } else { push(@b,$a); } } print F join("\n", @b); endwin(); exec "@ARGV @cmd";