#!/usr/bin/env ruby # # $Id: global.rb,v 1.2 2001/05/25 16:58:38 sakamoto Exp $ # require "curses" include Curses # # main # if ARGV.size == 0 or ARGV.size > 2 printf("usage: [option] pattern\n") exit end opt = ARGV.size == 2 ? ARGV.shift : "" pattern = ARGV.shift.sub("[ ]+$", "") # # init screen # init_screen nonl cbreak noecho # # loop # loop = true while loop # # exec global # f = open("|global #{opt} \"#{pattern}\"") data_lines = [] f.each_line { |l| data_lines.push(l.gsub("\t", " ").gsub("[\x80-\xff].", "##")) } f.close # # draw # lptr = 0 curline = 0 curcol = 0 plines = lines - 1 info = "#{opt} #{pattern}" clear while TRUE setpos(plines, 0) deleteln if data_lines.size == 0 setpos(0, 0) addstr("no entry") else for i in 0...plines break if lptr + i > data_lines.size - 1 setpos(i, 0) line = data_lines[lptr + i] setpos(i, 0) deleteln setpos(i, 0) if i == curline addstr(">") else addstr(" ") end # attrset(Curses::A_REVERSE) if i == curline setpos(i, 1) addstr(line[curcol...line.size]) if curcol < line.size # attrset(0) if i == curline end end setpos(plines, 0) addstr(info) info = "" refresh c = getch.chr case c when "<" lptr = curline = 0 when ">" curline = data_lines.size - 1 lptr = curline - plines - 1 when "h" curcol -= 1 curcol = 0 if curcol < 0 when "H", "0" curcol = 0 when "l" curcol += 1 when "L", "$" curcol += cols / 2 when "j", "", " " if c == "j" i = 1 else i = plines clear end if (curline + i >= plines) lptr += i else curline += i end when "k", "" if c == "k" i = 1 else i = plines clear end if (curline - i < 0) lptr -= i else curline -= i end when "" d = data_lines[lptr + curline].split case d.size when 1 system "less #{d[0]}" else system "less +#{d[1].to_i}G #{d[2]}" end clear when "v" d = data_lines[lptr + curline].split case d.size when 1 system "vi #{d[0]}" else system "vi +#{d[1]} #{d[2]}" end clear when "?" info = "tgrVP" when "/", "n" setpos(plines, 0) deleteln addstr("/") echo search = getstr if c == "/" noecho i = lptr + curline i += 1 if c == "n" while i < data_lines.size if data_lines[i] =~ /#{search}/ if i - lptr > plines lptr = i curline = 0 clear else curline = i - lptr end break end i += 1 end info = "not found" if i == data_lines.size when "N" i = lptr + curline - 1 while i >= 0 if data_lines[i] =~ /#{search}/ if i < lptr lptr = i curline = 0 clear else curline = i - lptr end break end i -= 1 end info = "not found" if i < 0 when "t" opt = "-x" break when "g" opt = "-xg" break when "r" opt = "-xr" break when "V" opt = "-xs" break when "P" opt = "-P" break when "q", "Q" loop = false break end lptr = 0 if lptr < 0 lptr = data_lines.size - 1 if lptr > data_lines.size - 1 curline = 0 if curline < 0 last = data_lines.size - lptr - 1 curline = last if curline > last end end close_screen