--- iselect.pl 2007/10/25 13:24:02 6 +++ iselect.pl 2007/10/25 14:11:42 7 @@ -2,7 +2,7 @@ use strict; use Term::Screen; -use Carp qw/confess/; +use Carp qw/cluck/; use Data::Dump qw/dump/; my $data = <<'EOF'; @@ -75,8 +75,8 @@ sub chunk { my $t = shift; - return unless length($t) > 2; - return substr($t,1,$scr->cols); + cluck "expected line" unless defined $t; + return substr($t,0,$scr->cols); } sub redraw_line { @@ -95,6 +95,7 @@ redraw_line( $l, $line ); last if ($l == $#lines); } + selected(0); } sub status { @@ -127,7 +128,7 @@ } redraw; } elsif ( $d > 0 && $screen_line == $last_screen_line ) { - if ( $pos <= $#lines ) { + if ( $pos < $#lines ) { $top_screen_line++; $pos++; } else { @@ -168,24 +169,18 @@ # first line on screen? if ( $pos == $top_screen_line ) { $top_screen_line -= $lines_on_screen; - $top_screen_line = 0; - $pos = $top_screen_line; + $top_screen_line = 0 if $top_screen_line < 0; redraw; - selected( $pos ); - } else { - selected( -( $pos - $top_screen_line ) ); } + selected( -( $pos - $top_screen_line ) ); } elsif ($key eq 'pgdn' ) { # last line on screen? if ( $pos - $top_screen_line == $lines_on_screen ) { $top_screen_line += $lines_on_screen; - $top_screen_line = $#lines - $lines_on_screen if $top_screen_line > $#lines - $lines_on_screen; - $pos = $top_screen_line; + $top_screen_line = $#lines - $lines_on_screen if $top_screen_line >= $#lines - $lines_on_screen; redraw; - selected( $pos ); - } else { - selected( $top_screen_line + $scr->rows - $pos - 3 ); } + selected( $top_screen_line + $lines_on_screen - $pos ); } $status_text = sprintf("pos: %-3d sel_pos: %-3d top_screen_line: %-3d", $pos, $sel_pos, $top_screen_line ); @@ -197,7 +192,8 @@ status; - redraw if lc($key) eq 'r'; + # CTRL+L + redraw if ord($key) eq 0x0c; exit if (lc($key) eq 'q'); }