ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/searchable-scrollback
Revision: 1.6
Committed: Mon Jan 9 23:19:34 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.5: +1 -1 lines
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 root 1.4 $self->parse_keysym ($hotkey, "perl:searchable-scrollback:start")
11     or warn "unable to register '$hotkey' as scrollback search start hotkey\n";
12 root 1.1
13     ()
14     }
15    
16     sub on_keyboard_command {
17     my ($self, $cmd) = @_;
18    
19 root 1.4 if ($cmd eq "searchable-scrollback:start") {
20 root 1.1 $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 root 1.2 key_press => \&key_press,
43     refresh_begin => \&refresh,
44     refresh_end => \&refresh,
45 root 1.1 );
46    
47     $self->idle;
48     }
49    
50     sub leave {
51     my ($self) = @_;
52    
53     delete $self->{overlay};
54    
55 root 1.2 $self->disable ("key_press", "refresh_begin", "refresh_end");
56 root 1.1
57     $self->pty_ev_events ($self->{pty_ev_events});
58     $self->want_refresh;
59     }
60    
61     sub idle {
62     my ($self) = @_;
63    
64 root 1.3 $self->msg ("scrollback search, escape=exit, enter=accept, /=start search, n=next, p=previous, G=bottom");
65 root 1.1
66     delete $self->{in_search};
67     }
68    
69     sub search {
70 root 1.5 my ($self, $offset) = @_;
71 root 1.1
72 root 1.5 my $row = -$self->view_start + ($self->nrow >> 1) + $offset;
73 root 1.1
74     delete $self->{found};
75    
76     no re 'eval'; # just to be sure
77     my $re = qr/$self->{search}/;
78    
79     while ($row > -$self->nsaved) {
80     my $line = $self->line ($row)
81     or last;
82    
83     my $text = $line->t;
84     if ($text =~ /$re/g) {
85     do {
86 root 1.2 push @{ $self->{found} }, [$line->coord_of ($-[0]), $line->coord_of ($+[0])];
87 root 1.1 } while $text =~ /$re/g;
88    
89     $self->view_start (-$row + ($self->nrow >> 1));
90     last;
91     }
92    
93     $row = $line->beg - 1;
94     }
95    
96     $self->msg ("enter/type/backspace: /$self->{search}_"
97 root 1.3 . ($self->{found} ? "" : " (not found)"));
98 root 1.1 $self->scr_bell unless $self->{found};
99     }
100    
101 root 1.2 sub refresh {
102     my ($self) = @_;
103    
104     return unless $self->{found};
105    
106 root 1.5 $self->scr_xor_span (@$_, urxvt::SET_FGCOLOR (urxvt::RS_RVid, 15))
107 root 1.2 for @{ $self->{found} };
108    
109     ()
110     }
111    
112     sub key_press {
113 root 1.1 my ($self, $event, $keysym, $string) = @_;
114    
115     if (exists $self->{in_search}) {
116     if ($keysym == 0xff0d || $keysym == 0xff8d) {
117 root 1.2 $self->idle;
118 root 1.1 } elsif ($keysym == 0xff1b) {
119 root 1.2 $self->view_start ($self->{in_search});
120     $self->idle;
121 root 1.1 } elsif ($keysym == 0xff08) {
122     substr $self->{search}, -1, 1, "";
123 root 1.2 $self->search;
124 root 1.1 } elsif ($string ne "") {
125     $self->{search} .= $string;
126 root 1.2 $self->search;
127 root 1.1 }
128     } else {
129     if ($keysym == 0xff0d || $keysym == 0xff8d) {
130     # OK
131     $self->leave;
132     } elsif ($keysym == 0xff1b) {
133     $self->view_start ($self->{view_start});
134     $self->leave;
135     } elsif ($keysym == 0xff52) {
136     $self->view_start ($self->view_start + 1);
137     } elsif ($keysym == 0xff54) {
138     $self->view_start ($self->view_start - 1);
139     } elsif ($string eq "/") {
140     $self->{in_search} = $self->view_start;
141     $self->search;
142 root 1.3 } elsif ($string eq "G") {
143     $self->view_start (0);
144 root 1.1 } elsif ($string eq "n") {
145 root 1.5 $self->search (-1);
146     $self->idle;
147 root 1.6 } elsif ($string eq "p" or $string eq "N") {
148 root 1.3 # TODO
149 root 1.1 } elsif ($string ne "") {
150     $self->scr_bell;
151     }
152     }
153    
154     1
155     }
156    
157