/[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

Annotation of /bin/iselect.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (hide annotations)
Thu Oct 25 13:24:02 2007 UTC (16 years, 4 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 dpavlin 1 #!/usr/bin/perl -w
2    
3     use strict;
4     use Term::Screen;
5 dpavlin 4 use Carp qw/confess/;
6 dpavlin 1 use Data::Dump qw/dump/;
7    
8     my $data = <<'EOF';
9     First line
10    
11 dpavlin 4 {s}first selectable
12     {s}second selectable
13 dpavlin 1
14     a space....
15    
16     ...infinity and beyond
17    
18    
19 dpavlin 4 {s}foo
20     {s}bar
21 dpavlin 1
22     bum
23 dpavlin 4
24 dpavlin 1 EOF
25    
26     open(my $ps, "ps ax |") || die "can't do ps ax: $!";
27     while(<$ps>) {
28 dpavlin 4 $data .= '{s}'.$_;
29     $data .= $_;
30 dpavlin 1 }
31     close($ps);
32    
33 dpavlin 6 $data .= "\n--EOF--";
34    
35 dpavlin 2 my $scr;
36 dpavlin 1
37 dpavlin 2 # leave sane terminal if script dies
38     $SIG{__DIE__} = sub {
39     eval { system('stty sane'); };
40     };
41    
42    
43 dpavlin 1 my @lines = split(/\n/, $data);
44    
45 dpavlin 6 my $top_screen_line = 0; # offset in original text
46 dpavlin 1 my $pos = 0;
47    
48 dpavlin 2 # default: select first line
49     my $sel_pos = 0;
50     my $status_text = '';
51     my $error_text = '';
52    
53    
54 dpavlin 1 # find which lines are selectable in input file
55     my $selectable_line;
56    
57     for my $l (0 .. $#lines) {
58 dpavlin 4 if ($lines[$l] !~ s/^{s}//) {
59 dpavlin 1 $selectable_line->{$l}++;
60     }
61     }
62    
63 dpavlin 2 # select first selectable line
64    
65     if ( $selectable_line ) {
66 dpavlin 3 $pos = $sel_pos = (sort { $a <=> $b } keys %$selectable_line)[0];
67     warn "selected first selectable line $sel_pos";
68 dpavlin 2 }
69    
70 dpavlin 1 sub full_line {
71     my $t = shift;
72 dpavlin 4 $t = '' unless defined $t;
73 dpavlin 1 return $t . (" " x ($scr->cols - length($t)));
74     }
75    
76     sub chunk {
77     my $t = shift;
78 dpavlin 4 return unless length($t) > 2;
79     return substr($t,1,$scr->cols);
80 dpavlin 1 }
81    
82 dpavlin 4 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 dpavlin 1 sub redraw {
93 dpavlin 4 for my $l (0 .. $scr->rows - 3) {
94 dpavlin 6 my $line = $lines[ $l + $top_screen_line ];
95 dpavlin 4 redraw_line( $l, $line );
96 dpavlin 1 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 dpavlin 2 my $d = shift || 0;
114 dpavlin 1
115 dpavlin 6 my $screen_line = $pos - $top_screen_line;
116 dpavlin 1
117 dpavlin 4 redraw_line( $screen_line, $lines[$pos] );
118 dpavlin 1
119 dpavlin 4 my $last_screen_line = $scr->rows - 3;
120    
121     if ( $d < 0 && $screen_line == 0 ) {
122     if ( $pos > 0 ) {
123 dpavlin 6 $top_screen_line--;
124 dpavlin 5 $pos--;
125 dpavlin 4 } else {
126     $error_text = "Already at Begin.";
127     }
128 dpavlin 1 redraw;
129 dpavlin 4 } elsif ( $d > 0 && $screen_line == $last_screen_line ) {
130     if ( $pos <= $#lines ) {
131 dpavlin 6 $top_screen_line++;
132 dpavlin 5 $pos++;
133 dpavlin 4 } else {
134     $error_text = "Already at End.";
135     }
136 dpavlin 1 redraw;
137 dpavlin 4 } else {
138     $pos += $d;
139 dpavlin 1 }
140    
141 dpavlin 4 my $line = $lines[$pos];
142     if ( defined $selectable_line->{ $pos } ) {
143 dpavlin 6 $scr->at($pos - $top_screen_line,0)->reverse->bold()->puts( full_line( chunk($line) ) )->normal();
144 dpavlin 4 $sel_pos = $pos;
145     } else {
146 dpavlin 6 $scr->at($pos - $top_screen_line,0)->reverse->puts( full_line( chunk($line) ) );
147 dpavlin 4 $sel_pos = -1;
148     }
149 dpavlin 1 status;
150     }
151    
152 dpavlin 2 $scr = new Term::Screen || die "can't init Term::Screen";
153     $scr->clrscr()->noecho();
154 dpavlin 1 redraw;
155     selected;
156    
157     while(my $key = $scr->getch()) {
158    
159     $error_text = "";
160    
161 dpavlin 6 my $lines_on_screen = $scr->rows - 3;
162    
163 dpavlin 1 if ($key eq 'ku') {
164     selected( -1 );
165     } elsif ($key eq 'kd') {
166     selected( +1 );
167 dpavlin 6 } 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 dpavlin 1 }
190    
191 dpavlin 6 $status_text = sprintf("pos: %-3d sel_pos: %-3d top_screen_line: %-3d", $pos, $sel_pos, $top_screen_line );
192 dpavlin 4 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 dpavlin 1 status;
199    
200 dpavlin 4 redraw if lc($key) eq 'r';
201    
202 dpavlin 1 exit if (lc($key) eq 'q');
203     }
204    
205     $scr->clrscr();

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26