開発メモ

開発関係のメモをいろいろと。たぶん。

Rubyでcursesの実験 【基本編】

Rubycursesを使う実験をした時のメモ。基本編。

実験に使ったのは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

実際に実行するとこんな感じになる。

f:id:see_ku:20130627214320p:plain

f:id:see_ku:20130627214332p:plain

f:id:see_ku:20130627214345p:plain

基本的な処理の流れは以下のとおり。

  1. Curses.init_screenでcursesを初期化
  2. 画面に文字を出力
  3. refreshで画面を更新
  4. 操作が終わったらCurses.close_screen

とっても簡単。

サンプルだけ見てるとわからないけど、実際には、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引数はどこにも説明がないけど、普通に使える。指定しなかった場合、システム側が角を勝手に処理してくれるハズ。

実行結果はこんな感じ。

f:id:see_ku:20130627214540p:plain

f:id:see_ku:20130627214556p:plain

f:id:see_ku:20130627214608p:plain

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

実行結果はこんな感じ。

f:id:see_ku:20130627214804p:plain

f:id:see_ku:20130627214817p:plain

f:id:see_ku:20130627214832p:plain

CentOSで、Putty側で文字コードUTF-8に設定しただけ。基本的に、特に何もしなくても正常に出力されてるっぽい。

情報元

module Curses
http://doc.ruby-lang.org/ja/2.0.0/class/Curses.html

RubyInstaller for Windows
http://rubyinstaller.org/