ruby/ext/curses/view2.rb

116 строки
1.9 KiB
Ruby

#!/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
when Curses::KEY_NPAGE, ?\s # white space
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