#!/usr/bin/env ruby # # $Id: dmake.rb,v 1.1 2001/05/25 16:58:38 sakamoto Exp $ # require "curses" include Curses # # main # arg = "" ARGV.each do |a| arg += a + " " end info = "" $stdout.sync = true # # loop # loop = true while loop # # exec make # warn = 0 f = open("|make #{arg} 2>&1") data_lines = [] raw_lines = [] f.each_line { |l| data_lines.push(l.gsub("\t", " ").gsub("[\x80-\xff].", "##")) raw_lines.push(l) warn += 1 if l =~ /^([^:]+):(\d+): warning:/ print l } f.close exit if $? == 0 and warn == 0 # # init screen # init_screen nonl cbreak noecho plines = lines - 1 # # draw # lptr = 0 curline = 0 curcol = 0 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 "", "v" data_lines[lptr + curline] =~ /^([^:]+):(\d+):/ f = $1 l = $2 unless f.nil? or l.nil? if c == "" system "less +#{l}G #{f}" else system "vi +#{l} #{f}" end clear end when "V" fname = "/tmp/.dmake.#{$$}" f = File.open(fname, "w") raw_lines.each do |l| f.write l end f.close system "less #{fname}" unlink fname clear 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 " " i = lptr + curline + 1 while i < data_lines.size if data_lines[i] =~ /^[^:]+:\d+:/ and !(data_lines[i] =~ /^In file/ or data_lines[i] =~ /^\s+/) 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 "r", "R" 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 close_screen end