]> mj.ucw.cz Git - vs.git/commitdiff
Added global search (experimental). master
authorMartin Mares <mj@ucw.cz>
Fri, 22 Apr 2005 22:44:40 +0000 (22:44 +0000)
committerMartin Mares <mj@ucw.cz>
Fri, 22 Apr 2005 22:44:40 +0000 (22:44 +0000)
TODO
vs.pl

diff --git a/TODO b/TODO
index d425edfe2690b9a7e367a94c15e174d427049d29..260a14ad09d428dbace2ddd4285e2b47af2a7c81 100644 (file)
--- 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 34502e8c2d9a39d7a54792571c0d76480e354fac..28443068d0e279c50777cdd3505b34dd6a6f42ba 100755 (executable)
--- a/vs.pl
+++ b/vs.pl
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 # The Virtual Songbook
-# (c) 2003--2004 Martin Mares <mj@ucw.cz>
+# (c) 2003--2005 Martin Mares <mj@ucw.cz>
 
 use Curses;
 use strict;
@@ -10,8 +10,8 @@ use warnings;
 
 my @help_message = (
        "",
-       "   The Virtual Songbook 0.9\n",
-       "   (c) 2003--2004 Martin Mares <mj\@ucw.cz>",
+       "   The Virtual Songbook 0.9.1\n",
+       "   (c) 2003--2005 Martin Mares <mj\@ucw.cz>",
        "",
        "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 = ( "<back>" );
+       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 "<parent>") {
+       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;