2001-08-13 03:42:44 +04:00
|
|
|
#!/usr/local/bin/ruby
|
|
|
|
|
|
|
|
require "curses"
|
|
|
|
|
|
|
|
if ARGV.size != 1 then
|
|
|
|
printf("usage: view file\n");
|
|
|
|
exit
|
|
|
|
end
|
|
|
|
begin
|
|
|
|
fp = open(ARGV[0], "r")
|
|
|
|
rescue
|
|
|
|
raise "cannot open file: #{ARGV[1]}"
|
|
|
|
end
|
|
|
|
|
|
|
|
# signal(SIGINT, finish)
|
|
|
|
|
|
|
|
Curses.init_screen
|
|
|
|
Curses.nonl
|
|
|
|
Curses.cbreak
|
|
|
|
Curses.noecho
|
|
|
|
|
|
|
|
$screen = Curses.stdscr
|
|
|
|
|
|
|
|
$screen.scrollok(true)
|
|
|
|
#$screen.keypad(true)
|
|
|
|
|
|
|
|
# slurp the file
|
|
|
|
$data_lines = []
|
|
|
|
fp.each_line { |l|
|
|
|
|
$data_lines.push(l.chop)
|
|
|
|
}
|
|
|
|
fp.close
|
|
|
|
|
|
|
|
$top = 0
|
|
|
|
$data_lines[0..$screen.maxy-1].each_with_index{|line, idx|
|
|
|
|
$screen.setpos(idx, 0)
|
|
|
|
$screen.addstr(line)
|
|
|
|
}
|
|
|
|
$screen.setpos(0,0)
|
|
|
|
$screen.refresh
|
|
|
|
|
|
|
|
def scroll_up
|
|
|
|
if( $top > 0 )
|
|
|
|
$screen.scrl(-1)
|
|
|
|
$top -= 1
|
|
|
|
str = $data_lines[$top]
|
|
|
|
if( str )
|
|
|
|
$screen.setpos(0, 0)
|
|
|
|
$screen.addstr(str)
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def scroll_down
|
|
|
|
if( $top + $screen.maxy < $data_lines.length )
|
|
|
|
$screen.scrl(1)
|
|
|
|
$top += 1
|
|
|
|
str = $data_lines[$top + $screen.maxy - 1]
|
|
|
|
if( str )
|
|
|
|
$screen.setpos($screen.maxy - 1, 0)
|
|
|
|
$screen.addstr(str)
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
while true
|
|
|
|
result = true
|
|
|
|
c = Curses.getch
|
|
|
|
case c
|
|
|
|
when Curses::KEY_DOWN, Curses::KEY_CTRL_N
|
|
|
|
result = scroll_down
|
|
|
|
when Curses::KEY_UP, Curses::KEY_CTRL_P
|
|
|
|
result = scroll_up
|
2002-06-18 10:29:07 +04:00
|
|
|
when Curses::KEY_NPAGE, ?\s # white space
|
2001-08-13 03:42:44 +04:00
|
|
|
for i in 0..($screen.maxy - 2)
|
|
|
|
if( ! scroll_down )
|
|
|
|
if( i == 0 )
|
|
|
|
result = false
|
|
|
|
end
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
when Curses::KEY_PPAGE
|
|
|
|
for i in 0..($screen.maxy - 2)
|
|
|
|
if( ! scroll_up )
|
|
|
|
if( i == 0 )
|
|
|
|
result = false
|
|
|
|
end
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
when Curses::KEY_LEFT, Curses::KEY_CTRL_T
|
|
|
|
while( scroll_up )
|
|
|
|
end
|
|
|
|
when Curses::KEY_RIGHT, Curses::KEY_CTRL_B
|
|
|
|
while( scroll_down )
|
|
|
|
end
|
|
|
|
when ?q
|
|
|
|
break
|
|
|
|
else
|
|
|
|
$screen.setpos(0,0)
|
|
|
|
$screen.addstr("[unknown key `#{Curses.keyname(c)}'=#{c}] ")
|
|
|
|
end
|
|
|
|
if( !result )
|
|
|
|
Curses.beep
|
|
|
|
end
|
|
|
|
$screen.setpos(0,0)
|
|
|
|
end
|
|
|
|
Curses.close_screen
|