From: Martin Mares Date: Fri, 22 Apr 2005 22:44:40 +0000 (+0000) Subject: Added global search (experimental). X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;ds=sidebyside;p=vs.git Added global search (experimental). --- diff --git a/TODO b/TODO index d425edf..260a14a 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -- search for song text (grep) +- CLEANUP: search for song text + - sorting of file list (use locale;) -- auto-transpose :) - chord hints window diff --git a/vs.pl b/vs.pl index 34502e8..2844306 100755 --- a/vs.pl +++ b/vs.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl # The Virtual Songbook -# (c) 2003--2004 Martin Mares +# (c) 2003--2005 Martin Mares use Curses; use strict; @@ -10,8 +10,8 @@ use warnings; my @help_message = ( "", - " The Virtual Songbook 0.9\n", - " (c) 2003--2004 Martin Mares ", + " The Virtual Songbook 0.9.1\n", + " (c) 2003--2005 Martin Mares ", "", "Control keys:", "", @@ -40,11 +40,11 @@ my @help_message = ( " j k h l synonyms of the arrow keys (like in vi) [works in any window]", " Ctrl-R reload the list", " r toggle resolving of song/directory names", - " / incremental search (/=next, \\=previous)", + " / incremental search (/=next, \\=previous, ?=search over all songs)", "", ); -my $help_status = "The Virtual Songbook 0.9"; +my $help_status = "The Virtual Songbook 0.9.1"; ### Interface with Curses ### @@ -624,6 +624,7 @@ sub reload($) { $w->{"i"} = 0; $w->{"1st"} = 0; $w->{"search"} = undef; + $w->{"search-results"} = 0; } sub redraw_line($$) { @@ -686,7 +687,7 @@ sub goto($$) { } else { $w->redraw_line($i); } $w->{"win"}->noutrefresh; } - if ($auto_enter && $i < $w->{"n"} && $w->{"flist"}->[$i] !~ /\/$/) { $w->select; } + if ($auto_enter) { $w->select(0); } } sub go($$) { @@ -713,36 +714,88 @@ sub search_next($$) { $w->goto($i); } -sub select($) { - my ($w) = @_; +sub goto_name($$) { + my ($w, $name) = @_; + for (my $i=0; $i<$w->{"n"}; $i++) { + if ($w->{"flist"}->[$i] eq $name) { + $w->{"i"} = $i; + $w->{"1st"} = $i - int($w->{"h"}/2); + last; + } + } +} + +sub select($$) { + my ($w, $explicit) = @_; if ($w->{"i"} < $w->{"n"}) { my $f = $w->{"flist"}->[$w->{"i"}]; my $x = $w->{"list"}->[$w->{"i"}]; if ($f =~ /\/$/) { - if ($f eq "../") { - $w->{"dir"} =~ s@([^/]*/)$@@; - my $back = $1; - $w->{"xdir"} =~ s@[^/]*/$@@; - $w->reload; - for (my $i=0; $i<$w->{"n"}; $i++) { - if ($w->{"flist"}->[$i] eq $back) { - $w->{"i"} = $i; - $w->{"1st"} = $i - int($w->{"h"}/2); - last; - } + if ($explicit) { + if ($f eq "../") { + $w->{"dir"} =~ s@([^/]*/)$@@; + my $back = $1; + $w->{"xdir"} =~ s@[^/]*/$@@; + $w->reload; + $w->goto_name($back); + } else { + $w->{"dir"} .= $f; + $w->{"xdir"} .= $x; + $w->reload; } - } else { - $w->{"dir"} .= $f; - $w->{"xdir"} .= $x; - $w->reload; + $w->redraw; } - $w->redraw; } else { + if ($w->{"search-results"} && $explicit) { + $f =~ m@^(.*/)([^/]+)$@ or die; + $w->{"dir"} = $1; + $f = $2; + $w->{"xdir"} = "???"; ### FIXME + $w->reload; + $w->goto_name($f); + $w->redraw; + } $main_window->view($w->{"dir"} . $f, $w->{"xdir"} . $x); } } } +sub global_search() { + my ($w) = @_; + my @full = ( "" ); + my @fn = ( $w->{"dir"} ); + $w->{"dir"} = "./"; + $w->{"xdir"} = "./"; + + my $query = $w->{"search"}; + $query =~ tr/"'\\\`//d; + my @resp = `../search/songsearch -C ../search/config -i ../search/index -n 20 $query`; + chomp @resp; + while (@resp) { + my $r = shift @resp; + $r =~ /^\d+\. \[\d+\] (.*)/ or next; + my $file = $1; + my $name = shift @resp; + $name =~ s/^\t// or $name = $file; + while (@resp && $resp[0] =~ /^\t/) { + $r = shift @resp; + $r =~ s/^\t//; + $name .= " ($r)"; + } + push @fn, $file; + push @full, $name; + } + + $w->{"flist"} = \@fn; + $w->{"list"} = \@full; + $w->{"n"} = scalar @fn; + $w->{"i"} = 0; + $w->{"1st"} = 0; + $w->{"search"} = undef; + $w->{"search-results"} = 1; + $w->redraw; +} + sub key($$) { my ($w,$key) = @_; if ($key eq KEY_UP) { $w->go(-1); } @@ -751,11 +804,14 @@ sub key($$) { elsif ($key eq KEY_NPAGE) { $w->go($w->{"h"}-1); } elsif ($key eq KEY_HOME) { $w->go(-1000000000); } elsif ($key eq KEY_END) { $w->go(1000000000); } - elsif ($key eq KEY_RIGHT || $key eq "\r" || $key eq "\n") { $w->{"search"}=undef; $w->goto($w->{"i"}); $w->select; } - elsif ($key eq KEY_LEFT) { - if ($w->{"list"}->[0] eq "") { + elsif ($key eq KEY_RIGHT || $key eq "\r" || $key eq "\n") { + $w->{"search"}=undef; + $w->goto($w->{"i"}); + $w->select(1); + } elsif ($key eq KEY_LEFT) { + if ($w->{"list"}->[0] =~ /^<(parent|back)>$/) { $w->{"i"} = 0; - $w->select; + $w->select(1); } } elsif ($key eq "\x12") { $w->reload; @@ -774,7 +830,7 @@ sub key($$) { } elsif ($key eq "\\") { $w->search_next($w->{"i"}-1, -1); } elsif ($key eq "?") { - return 0; + $w->global_search; } elsif ($key eq KEY_BACKSPACE) { if (length $w->{"search"}) { $w->{"search"} =~ s/.$//; @@ -793,8 +849,6 @@ sub key($$) { } elsif ($key eq "/") { $w->{"search"} = ""; $w->goto($w->{"i"}); - } elsif ($key eq "\n" || $key eq "\r") { - $w->select; } else { return 0; } } return 1;