Rubyでcursesの実験 【基本編】
実験に使ったのはRuby 2.0.0-p195。Windows環境では、RubyInstaller for Windowsの環境を使って確認。
cursesとは?
cursesとは、元々はCのプログラムからディスプレイ画面を制御するために用意されたUNIXのライブラリ。主に、以下の機能/特徴を備える。
- 端末に依存しない
- カーソルを画面上で自由に操作
- 画面上の任意の位置に文字を出力
- ウィンドウと呼ばれる矩形の領域で画面を管理
- それぞれのウィンドウを別々に管理
基本的な使い方
Ruby公式サイトのリファレンスに、ものすごく基本的なサンプルが載ってる。
以下、引用。
# encoding: utf-8 # Ruby公式のサンプル require 'curses' Curses.init_screen begin s = "Hello World!" Curses.setpos(Curses.lines / 2, Curses.cols / 2 - (s.length / 2)) Curses.addstr(s) Curses.refresh Curses.getch ensure Curses.close_screen end
実際に実行するとこんな感じになる。
基本的な処理の流れは以下のとおり。
とっても簡単。
サンプルだけ見てるとわからないけど、実際には、Curses.init_screenで標準スクリーン(stdscr)が作られて、それ以降のsetposやaddstrは、その、標準スクリーンを対象として操作が行われてる。
ウィンドウを使用
cursesの機能として、特定の矩形領域を独立したウィンドウとして管理することが可能。実際の使用例はこんな感じになる。
# encoding: utf-8 # ウィンドウのサンプル require 'curses' Curses.init_screen begin s = "Hello World!" win = Curses::Window.new(7, 40, 5, 10) win.box(?|,?-,?*) win.setpos(win.maxy / 2, win.maxx / 2 - (s.length / 2)) win.addstr(s) win.refresh win.getch win.close ensure Curses.close_screen end
box()の第3引数はどこにも説明がないけど、普通に使える。指定しなかった場合、システム側が角を勝手に処理してくれるハズ。
実行結果はこんな感じ。
「Curses」を通して暗黙のうちに標準スクリーンを使っていた部分が、明示的に、自分で作成したウィンドウを使うようになっただけ。特に大きな変化はなし。
日本語を出力
日本語を出力する実験。Ruby 2.0はマルチバイト文字も正常にカウントされるので、あえてバイト数を使ってみる。
# encoding: utf-8 # 日本語のサンプル require 'curses' Curses.init_screen begin s = "日本語での出力を実験" Curses.setpos(Curses.lines / 2, Curses.cols / 2 - (s.bytesize / 2)) Curses.addstr(s) Curses.refresh Curses.getch ensure Curses.close_screen end
実行結果はこんな感じ。
CentOSで、Putty側で文字コードをUTF-8に設定しただけ。基本的に、特に何もしなくても正常に出力されてるっぽい。
情報元
module Curses
http://doc.ruby-lang.org/ja/2.0.0/class/Curses.html
RubyInstaller for Windows
http://rubyinstaller.org/