2007年 09月 25日

curses のメモ

じぶんはターミナルをほぼ全画面表示させているので、横幅が結構ながい。
そんなんで、ときどき右側にちょっと表示させたいなぁってことがあったりするのでそれのサンプル。

#!/usr/bin/env ruby

require "curses"
class Curses::Window
	def puts(*msgs)
		write(msgs.map {|m| m.to_s.chomp + "\n" }.join)
	end

	def write(str)
		@data ||= ""
		@data << str

		setpos(0, 0)
		l = maxy - 1
		out = @data.split(/\n/).last(l).join("\n") + "\n"
		addstr(out)
		refresh
		@data = @data.match(/(.*\n)*.*\n?\z/)[0] 
	end

	def sync=(*)
	end
end

Curses.init_screen
begin
	win1 = Curses::Window.new(Curses.lines, (Curses.cols / 2).to_i, 0, 0)
	win2 = Curses::Window.new(Curses.lines, (Curses.cols / 2).to_i, 0, (Curses.cols / 2).to_i+1)

	Curses.refresh
	
	$stdout = win1
	$stderr = win2
	
	load(ARGV.first, true)

ensure
	Curses.close_screen
end

$stdout と $stderr を画面半分ずつわけて表示させてみる。引数に ruby スクリプトをとる。
うえのをてきとうに double.rb とかで保存して http://lab.lowreal.net/trac/browser/c/mendoi/proxy.rb を実行させると、左にのっとりされたファイル、右にスキャンしたファイルが表示される。

(画面ちっちゃくして撮影)

$0 == __FILE__ やってるスクリプトはうごかないけど、とりあえず proxy.rb だけこうしたかった (ちゃんとのっとりできてるかわかりにくかった)

@data をちゃんとつめないとだめだ
http://lab.lowreal.net/trac/changeset/877