1#!/usr/local/bin/ruby 2 3require "curses" 4include Curses 5 6# 7# main 8# 9 10if ARGV.size != 1 then 11 printf("usage: view file\n"); 12 exit 13end 14begin 15 fp = open(ARGV[0], "r") 16rescue 17 raise "cannot open file: #{ARGV[1]}" 18end 19 20# signal(SIGINT, finish) 21 22init_screen 23#keypad(stdscr, TRUE) 24nonl 25cbreak 26noecho 27#scrollok(stdscr, TRUE) 28 29# slurp the file 30data_lines = [] 31fp.each_line { |l| 32 data_lines.push(l) 33} 34fp.close 35 36 37lptr = 0 38while TRUE 39 i = 0 40 while i < lines 41 setpos(i, 0) 42 #clrtoeol 43 addstr(data_lines[lptr + i] || '') 44 i += 1 45 end 46 refresh 47 48 explicit = FALSE 49 n = 0 50 while TRUE 51 c = getch 52 if c =~ /[0-9]/ 53 n = 10 * n + c.to_i 54 else 55 break 56 end 57 end 58 59 n = 1 if !explicit && n == 0 60 61 case c 62 when "n" #when KEY_DOWN 63 i = 0 64 while i < n 65 if lptr + lines < data_lines.size then 66 lptr += 1 67 else 68 break 69 end 70 i += 1 71 end 72 #wscrl(i) 73 74 when "p" #when KEY_UP 75 i = 0 76 while i < n 77 if lptr > 0 then 78 lptr -= 1 79 else 80 break 81 end 82 i += 1 83 end 84 #wscrl(-i) 85 86 when "q" 87 break 88 end 89 90end 91close_screen 92