ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/searchable-scrollback
(Generate patch)

Comparing rxvt-unicode/src/perl/searchable-scrollback (file contents):
Revision 1.34 by root, Sat May 17 17:12:29 2014 UTC vs.
Revision 1.39 by sf-exg, Mon Jun 9 19:40:42 2014 UTC

5#:META:RESOURCE:%:string:activation hotkey keysym 5#:META:RESOURCE:%:string:activation hotkey keysym
6#:META:BINDING:M-s:start 6#:META:BINDING:M-s:start
7 7
8=head1 NAME 8=head1 NAME
9 9
10searchable-scrollback<hotkey> - incremental scrollback search (enabled by default) 10searchable-scrollback - incremental scrollback search (enabled by default)
11 11
12=head1 DESCRIPTION 12=head1 DESCRIPTION
13 13
14Adds regex search functionality to the scrollback buffer, triggered 14Adds regex search functionality to the scrollback buffer, triggered by
15by a hotkey (default: C<M-s>). While in search mode, normal terminal 15the C<searchable-scrollback:start> action (bound to C<M-s> by
16default). While in search mode, normal terminal input/output is
16input/output is suspended and a regex is displayed at the bottom of the 17suspended and a regex is displayed at the bottom of the screen.
17screen.
18 18
19Inputting characters appends them to the regex and continues incremental 19Inputting characters appends them to the regex and continues incremental
20search. C<BackSpace> removes a character from the regex, C<Up> and C<Down> 20search. C<BackSpace> removes a character from the regex, C<Up> and C<Down>
21search upwards/downwards in the scrollback buffer, C<End> jumps to the 21search upwards/downwards in the scrollback buffer, C<End> jumps to the
22bottom. C<Escape> leaves search mode and returns to the point where search 22bottom. C<Escape> leaves search mode and returns to the point where search
91 $self->disable ("key_press", "tt_write", "refresh_begin", "refresh_end"); 91 $self->disable ("key_press", "tt_write", "refresh_begin", "refresh_end");
92 $self->pty_ev_events ($self->{pty_ev_events}); 92 $self->pty_ev_events ($self->{pty_ev_events});
93 93
94 delete $self->{manpage_overlay}; 94 delete $self->{manpage_overlay};
95 delete $self->{overlay}; 95 delete $self->{overlay};
96 delete $self->{history};
97 delete $self->{search}; 96 delete $self->{search};
98} 97}
99 98
100sub idle { 99sub idle {
101 my ($self) = @_; 100 my ($self) = @_;
102 101
103 $self->msg ("(escape cancels) /$self->{search}█"); 102 $self->msg ("(escape cancels) /$self->{search}█");
104} 103}
105 104
106sub search { 105sub search {
107 my ($self, $dir) = @_; 106 my ($self, $dir, $row) = @_;
108
109 delete $self->{found};
110 my $row = $self->{row};
111 107
112 my $search = $self->special_encode ($self->{search}); 108 my $search = $self->special_encode ($self->{search});
113 109
114 no re 'eval'; # just to be sure 110 no re 'eval'; # just to be sure
115 if (my $re = eval { qr/$search/ }) { 111 if (my $re = eval { qr/$search/ }) {
117 my $line = $self->line ($row) 113 my $line = $self->line ($row)
118 or last; 114 or last;
119 115
120 my $text = $line->t; 116 my $text = $line->t;
121 if ($text =~ /$re/g) { 117 if ($text =~ /$re/g) {
118 delete $self->{found};
119
122 do { 120 do {
123 push @{ $self->{found} }, [$line->coord_of ($-[0]), $line->coord_of ($+[0])]; 121 push @{ $self->{found} }, [$line->coord_of ($-[0]), $line->coord_of ($+[0])];
124 } while $text =~ /$re/g; 122 } while $text =~ /$re/g;
125 123
126 $self->{row} = $row; 124 $self->{row} = $row;
127 $self->view_start (List::Util::min 0, $row - ($self->nrow >> 1)); 125 $self->view_start (List::Util::min 0, $row - ($self->nrow >> 1));
128 $self->want_refresh; 126 $self->want_refresh;
129 last; 127 return;
130 } 128 }
131 129
132 $row = $dir < 0 ? $line->beg - 1 : $line->end + 1; 130 $row = $dir < 0 ? $line->beg - 1 : $line->end + 1;
133 } 131 }
134 } 132 }
135 133
136 $self->scr_bell unless $self->{found}; 134 $self->scr_bell;
137} 135}
138 136
139sub refresh { 137sub refresh {
140 my ($self) = @_; 138 my ($self) = @_;
141 139
168 $self->leave; 166 $self->leave;
169 } elsif ($keysym == 0xff57) { # end 167 } elsif ($keysym == 0xff57) { # end
170 $self->{row} = $self->nrow - 1; 168 $self->{row} = $self->nrow - 1;
171 $self->view_start (0); 169 $self->view_start (0);
172 } elsif ($keysym == 0xff52) { # up 170 } elsif ($keysym == 0xff52) { # up
173 $self->{row}-- if $self->{row} > $self->top_row; 171 my $line = $self->line ($self->{row});
174 $self->search (-1); 172 $self->search (-1, $line->beg - 1)
173 if $line->beg > $self->top_row;
175 } elsif ($keysym == 0xff54) { # down 174 } elsif ($keysym == 0xff54) { # down
176 $self->{row}++ if $self->{row} < $self->nrow; 175 my $line = $self->line ($self->{row});
177 $self->search (+1); 176 $self->search (+1, $line->end + 1)
177 if $line->end < $self->nrow;
178 } elsif ($keysym == 0xff08) { # backspace 178 } elsif ($keysym == 0xff08) { # backspace
179 substr $self->{search}, -1, 1, ""; 179 substr $self->{search}, -1, 1, "";
180 $self->search; 180 $self->search (+1, $self->{row});
181 $self->idle; 181 $self->idle;
182 } elsif ($string !~ /[\x00-\x1f\x80-\xaf]/) { 182 } elsif ($string !~ /[\x00-\x1f\x80-\xaf]/) {
183 return; # pass to tt_write 183 return; # pass to tt_write
184 } 184 }
185 185
192 $self->{search} .= $self->locale_decode ($data); 192 $self->{search} .= $self->locale_decode ($data);
193 193
194 $self->{search} =~ s/^\(\?i\)// 194 $self->{search} =~ s/^\(\?i\)//
195 if $self->{search} =~ /^\(.*[[:upper:]]/; 195 if $self->{search} =~ /^\(.*[[:upper:]]/;
196 196
197 delete $self->{found};
197 $self->search (-1); 198 $self->search (-1, $self->{row});
198 $self->idle; 199 $self->idle;
199 200
200 1 201 1
201} 202}
202 203

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines