/[iselect]/bin/iselect.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /bin/iselect.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (show annotations)
Thu Oct 25 13:24:02 2007 UTC (16 years, 5 months ago) by dpavlin
Original Path: iselect.pl
File MIME type: text/plain
File size: 4138 byte(s)
- rename $o to $top_screen_line so I don't have to comment code all over :-)
- first try to implement page up/down
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Term::Screen;
5 use Carp qw/confess/;
6 use Data::Dump qw/dump/;
7
8 my $data = <<'EOF';
9 First line
10
11 {s}first selectable
12 {s}second selectable
13
14 a space....
15
16 ...infinity and beyond
17
18
19 {s}foo
20 {s}bar
21
22 bum
23
24 EOF
25
26 open(my $ps, "ps ax |") || die "can't do ps ax: $!";
27 while(<$ps>) {
28 $data .= '{s}'.$_;
29 $data .= $_;
30 }
31 close($ps);
32
33 $data .= "\n--EOF--";
34
35 my $scr;
36
37 # leave sane terminal if script dies
38 $SIG{__DIE__} = sub {
39 eval { system('stty sane'); };
40 };
41
42
43 my @lines = split(/\n/, $data);
44
45 my $top_screen_line = 0; # offset in original text
46 my $pos = 0;
47
48 # default: select first line
49 my $sel_pos = 0;
50 my $status_text = '';
51 my $error_text = '';
52
53
54 # find which lines are selectable in input file
55 my $selectable_line;
56
57 for my $l (0 .. $#lines) {
58 if ($lines[$l] !~ s/^{s}//) {
59 $selectable_line->{$l}++;
60 }
61 }
62
63 # select first selectable line
64
65 if ( $selectable_line ) {
66 $pos = $sel_pos = (sort { $a <=> $b } keys %$selectable_line)[0];
67 warn "selected first selectable line $sel_pos";
68 }
69
70 sub full_line {
71 my $t = shift;
72 $t = '' unless defined $t;
73 return $t . (" " x ($scr->cols - length($t)));
74 }
75
76 sub chunk {
77 my $t = shift;
78 return unless length($t) > 2;
79 return substr($t,1,$scr->cols);
80 }
81
82 sub redraw_line {
83 my ($l,$line) = @_;
84
85 if ( defined $selectable_line->{ $l } ) {
86 $scr->at($l,0)->bold()->puts( full_line( chunk($line) ) )->normal();
87 } else {
88 $scr->at($l,0)->puts( full_line( chunk($line) ) );
89 }
90 }
91
92 sub redraw {
93 for my $l (0 .. $scr->rows - 3) {
94 my $line = $lines[ $l + $top_screen_line ];
95 redraw_line( $l, $line );
96 last if ($l == $#lines);
97 }
98 }
99
100 sub status {
101 my $pcnt = int(($pos || 0) * 100 / ($#lines || 1));
102 my $pos_txt = sprintf('%d, %d%% ',$pos,$pcnt);
103
104 $scr->at($scr->rows - 2,0)->reverse()->puts(
105 sprintf(' %-'.($scr->cols - length($pos_txt) - 2).'s ',$status_text)
106 .$pos_txt)->normal();
107 $scr->at($scr->rows - 1,0)->puts(
108 sprintf('%-'.$scr->cols.'s', $error_text)
109 );
110 }
111
112 sub selected {
113 my $d = shift || 0;
114
115 my $screen_line = $pos - $top_screen_line;
116
117 redraw_line( $screen_line, $lines[$pos] );
118
119 my $last_screen_line = $scr->rows - 3;
120
121 if ( $d < 0 && $screen_line == 0 ) {
122 if ( $pos > 0 ) {
123 $top_screen_line--;
124 $pos--;
125 } else {
126 $error_text = "Already at Begin.";
127 }
128 redraw;
129 } elsif ( $d > 0 && $screen_line == $last_screen_line ) {
130 if ( $pos <= $#lines ) {
131 $top_screen_line++;
132 $pos++;
133 } else {
134 $error_text = "Already at End.";
135 }
136 redraw;
137 } else {
138 $pos += $d;
139 }
140
141 my $line = $lines[$pos];
142 if ( defined $selectable_line->{ $pos } ) {
143 $scr->at($pos - $top_screen_line,0)->reverse->bold()->puts( full_line( chunk($line) ) )->normal();
144 $sel_pos = $pos;
145 } else {
146 $scr->at($pos - $top_screen_line,0)->reverse->puts( full_line( chunk($line) ) );
147 $sel_pos = -1;
148 }
149 status;
150 }
151
152 $scr = new Term::Screen || die "can't init Term::Screen";
153 $scr->clrscr()->noecho();
154 redraw;
155 selected;
156
157 while(my $key = $scr->getch()) {
158
159 $error_text = "";
160
161 my $lines_on_screen = $scr->rows - 3;
162
163 if ($key eq 'ku') {
164 selected( -1 );
165 } elsif ($key eq 'kd') {
166 selected( +1 );
167 } elsif ($key eq 'pgup' ) {
168 # first line on screen?
169 if ( $pos == $top_screen_line ) {
170 $top_screen_line -= $lines_on_screen;
171 $top_screen_line = 0;
172 $pos = $top_screen_line;
173 redraw;
174 selected( $pos );
175 } else {
176 selected( -( $pos - $top_screen_line ) );
177 }
178 } elsif ($key eq 'pgdn' ) {
179 # last line on screen?
180 if ( $pos - $top_screen_line == $lines_on_screen ) {
181 $top_screen_line += $lines_on_screen;
182 $top_screen_line = $#lines - $lines_on_screen if $top_screen_line > $#lines - $lines_on_screen;
183 $pos = $top_screen_line;
184 redraw;
185 selected( $pos );
186 } else {
187 selected( $top_screen_line + $scr->rows - $pos - 3 );
188 }
189 }
190
191 $status_text = sprintf("pos: %-3d sel_pos: %-3d top_screen_line: %-3d", $pos, $sel_pos, $top_screen_line );
192 if ( length($key) > 1 ) {
193 $status_text .= " key: $key";
194 } else {
195 $status_text .= sprintf("key: %s [%03d][%02x]", $key =~ m/\w/ ? $key : '?' , ord($key), ord($key) );
196 }
197
198 status;
199
200 redraw if lc($key) eq 'r';
201
202 exit if (lc($key) eq 'q');
203 }
204
205 $scr->clrscr();

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26