ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/searchable-scrollback
Revision: 1.1
Committed: Mon Jan 9 22:41:41 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #! perl
2    
3     # this extension implements scrollback buffer search
4    
5     sub on_init {
6     my ($self) = @_;
7    
8     my $hotkey = $self->{argv}[0] || "M-s";
9    
10     $self->parse_keysym ($hotkey, "perl:searchable-scrollback:enter")
11     or warn "unable to register '$hotkey' as scrollback search enter hotkey\n";
12    
13     ()
14     }
15    
16     sub on_keyboard_command {
17     my ($self, $cmd) = @_;
18    
19     if ($cmd eq "searchable-scrollback:enter") {
20     $self->enter;
21     }
22    
23     ()
24     }
25    
26     sub msg {
27     my ($self, $msg) = @_;
28    
29     $self->{overlay} = $self->overlay (0, -1, $self->ncol, 1, urxvt::OVERLAY_RSTYLE, 0);
30     $self->{overlay}->set (0, 0, $self->special_encode ($msg));
31     }
32    
33     sub enter {
34     my ($self) = @_;
35    
36     return if $self->{overlay};
37    
38     $self->{pty_ev_events} = $self->pty_ev_events (urxvt::EVENT_NONE);
39     $self->{view_start} = $self->view_start;
40    
41     $self->enable (
42     refresh_begin => sub {
43     warn "beg(@_)\n";
44     },
45     refresh_end => sub {
46     warn "end(@_)\n";
47     },
48     );
49    
50     $self->idle;
51     }
52    
53     sub leave {
54     my ($self) = @_;
55    
56     delete $self->{overlay};
57    
58     $self->disable ("refresh_begin", "refresh_end");
59    
60     $self->pty_ev_events ($self->{pty_ev_events});
61     $self->want_refresh;
62     }
63    
64     sub idle {
65     my ($self) = @_;
66    
67     $self->msg ("scrollback search, escape=exit, enter=accept, /=start search, n=next, p=previous");
68    
69     delete $self->{in_search};
70     }
71    
72     sub search {
73     my ($self) = @_;
74    
75     my $row = -$self->view_start;
76    
77     delete $self->{found};
78    
79     no re 'eval'; # just to be sure
80     my $re = qr/$self->{search}/;
81    
82     while ($row > -$self->nsaved) {
83     my $line = $self->line ($row)
84     or last;
85    
86     my $text = $line->t;
87     if ($text =~ /$re/g) {
88     do {
89     push @{ $self->{found} }, [$line->coord_of ($-[0]), $line->coord_of ($+[1])];
90     } while $text =~ /$re/g;
91    
92     $self->view_start (-$row + ($self->nrow >> 1));
93     last;
94     }
95    
96     $row = $line->beg - 1;
97     }
98    
99     $self->msg ("enter/type/backspace: /$self->{search}_"
100     . ($self->{found} ? " (not found)" : ""));
101     $self->scr_bell unless $self->{found};
102     }
103    
104     sub on_key_press {
105     my ($self, $event, $keysym, $string) = @_;
106    
107     $self->{overlay}
108     or return;
109    
110     if (exists $self->{in_search}) {
111     if ($keysym == 0xff0d || $keysym == 0xff8d) {
112     delete $self->{in_search};
113     } elsif ($keysym == 0xff1b) {
114     $self->view_start (delete $self->{in_search});
115     } elsif ($keysym == 0xff08) {
116     substr $self->{search}, -1, 1, "";
117     } elsif ($string ne "") {
118     $self->{search} .= $string;
119     }
120    
121     $self->search;
122     } else {
123     if ($keysym == 0xff0d || $keysym == 0xff8d) {
124     # OK
125     $self->leave;
126     } elsif ($keysym == 0xff1b) {
127     $self->view_start ($self->{view_start});
128     $self->leave;
129     } elsif ($keysym == 0xff52) {
130     $self->view_start ($self->view_start + 1);
131     } elsif ($keysym == 0xff54) {
132     $self->view_start ($self->view_start - 1);
133     } elsif ($string eq "/") {
134     $self->{in_search} = $self->view_start;
135     $self->search;
136     } elsif ($string eq "n") {
137     } elsif ($string eq "p") {
138     } elsif ($string ne "") {
139     $self->scr_bell;
140     }
141     }
142    
143     1
144     }
145    
146