ext/curses/view2.rb: replaced with Hugh Sasse's version.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shugo 2010-02-06 14:26:07 +00:00
parent 3b21e88faa
commit 5fe1f62633

View File

@ -2,114 +2,148 @@
require "curses" 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) # A curses based file viewer
class FileViewer
Curses.init_screen # Create a new fileviewer, and view the file.
Curses.nonl def initialize(filename)
Curses.cbreak @data_lines = []
Curses.noecho @screen = nil
@top = nil
$screen = Curses.stdscr init_curses
load_file(filename)
$screen.scrollok(true) interact
#$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
end
def scroll_down # Perform the curses setup
if( $top + $screen.maxy < $data_lines.length ) def init_curses
$screen.scrl(1) # signal(SIGINT, finish)
$top += 1
str = $data_lines[$top + $screen.maxy - 1] Curses.init_screen
if( str ) Curses.nonl
$screen.setpos($screen.maxy - 1, 0) Curses.cbreak
$screen.addstr(str) Curses.noecho
end
return true @screen = Curses.stdscr
else
return false @screen.scrollok(true)
#$screen.keypad(true)
end end
end
while true # Load the file into memory, and put
result = true # the first part on the curses display.
c = Curses.getch def load_file(filename)
case c fp = open(filename, "r") do |fp|
when Curses::KEY_DOWN, Curses::KEY_CTRL_N # slurp the file
result = scroll_down fp.each_line { |l|
when Curses::KEY_UP, Curses::KEY_CTRL_P @data_lines.push(l.chop)
result = scroll_up }
when Curses::KEY_NPAGE, ?\s # white space end
for i in 0..($screen.maxy - 2) @top = 0
if( ! scroll_down ) @data_lines[0..@screen.maxy-1].each_with_index{|line, idx|
if( i == 0 ) @screen.setpos(idx, 0)
result = false @screen.addstr(line)
end }
break @screen.setpos(0,0)
@screen.refresh
rescue
raise "cannot open file '#{filename}' for reading"
end
# Scroll the display up by one line
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 end
return true
else
return false
end end
when Curses::KEY_PPAGE end
for i in 0..($screen.maxy - 2)
if( ! scroll_up ) # Scroll the display down by one line
if( i == 0 ) def scroll_down
result = false if( @top + @screen.maxy < @data_lines.length )
end @screen.scrl(1)
break @top += 1
str = @data_lines[@top + @screen.maxy - 1]
if( str )
@screen.setpos(@screen.maxy - 1, 0)
@screen.addstr(str)
end end
return true
else
return false
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 end
if( !result )
Curses.beep # Allow the user to interact with the display.
# This uses EMACS-like keybindings, and also
# vi-like keybindings as well, except that left
# and right move to the beginning and end of the
# file, respectively.
def interact
while true
result = true
c = Curses.getch
case c
when Curses::KEY_DOWN, Curses::KEY_CTRL_N, ?j
result = scroll_down
when Curses::KEY_UP, Curses::KEY_CTRL_P, ?k
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, ?h
while( scroll_up )
end
when Curses::KEY_RIGHT, Curses::KEY_CTRL_B, ?l
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
end end
$screen.setpos(0,0)
end end
Curses.close_screen
# If we are being run as a main program...
if __FILE__ == $0
if ARGV.size != 1 then
printf("usage: #{$0} file\n");
exit
end
viewer = FileViewer.new(ARGV[0])
end