mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
116 lines
1.9 KiB
Ruby
116 lines
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, ? # 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
|