mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	etc, instead. * parse.y (yylex): no here document after a dot. * parse.y (yylex): should have set lex_state after '`'. * parse.y (yylex): should have set lex_state properly after tOP_ASGN. * bignum.c (rb_big2dbl): return canonical HUGE_VAL for infinity. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2579 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			115 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, ?\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
 |