読者です 読者をやめる 読者になる 読者になる

いものやま。

雑多な知識の寄せ集め

Curses for Ruby。(その1)

以前、noteに書いた記事だけど、こちらにも。


CUIのアプリケーションを作るときによく利用されるのが、Cursesというライブラリ。

Rubyの場合、準標準ともいえるcursesライブラリがあり(※1.9.3までは標準添付ライブラリ)、これを使うのが一般的だと思う。
ただ、Web上に解説がほとんどなく、癖もなかなか強いため、いざ使おうとすると、かなり骨が折れる。

そこで、この記事ではcursesライブラリについて、サンプルコードを交えながら説明していきたいと思う。

前提

この記事は、以下の前提で書かれている:

なお、サンプルコードの動作確認は、MacRuby 2.0.0を使ってやっている。
(それ以外の環境でも、Cursesが使えるなら問題なく動くとは思う)

準備

Ruby 2.0.0以上の場合、cursesライブラリは標準では添付されていないので、RubyGemsからインストールする必要がある。

コマンドラインから以下のコマンドを実行してインストール。
$コマンドプロンプト。以下、同様)

$ gem install curses

cursesの動作確認

まずは、cursesの動作確認から。

以下のサンプルコードでcursesの動作確認をしてみる:

#====================
# hello_curses.rb
#--------------------
# cursesのサンプルコード
#====================

# cursesライブラリを読み込む
require "curses"

# Cursesモジュールのモジュール関数を簡単に呼び出せるようにする
include Curses

# cursesライブラリの初期化
init_screen

begin
  # 入力モードをcbreakモードに
  crmode

  # 画面中央に"Hit any key"と表示して入力待ち
  setpos((lines - 5) / 2, (cols - 10) / 2)
  addstr("Hit any key")
  refresh
  getch

  # ウィンドウを生成して"Hello, Curses!"と表示して入力待ち
  message = "Hello, Curses!"
  width = message.length + 6
  win = Window.new(5, width, (lines - 5) / 2, (cols - width) / 2)
  win.box('|', '-')
  win.setpos(2, 3)
  win.addstr(message)
  win.refresh
  win.getch

  # ウィンドウを閉じる
  win.close
  refresh
ensure
  # cursesライブラリの終了処理
  close_screen
end

このサンプルコードを実行するには、次のようにする:

$ ruby hello_curses.rb

Cursesが使える環境で、cursesライブラリが正しくインストールされていれば、問題なく実行出来るはず。

上記のサンプルコードを実行すると、ターミナルの中央に"Hit any key"という文字が表示される。
そのメッセージに従ってキーボードの任意のキーを叩くと、"Hit any key"という文字は消え、四角い枠の中に"Hello, Curses!"と表示される。
そして、さらにキーボードの任意のキーを叩くと、プログラムは終了する。

サンプルコードでやっている内容(「ウィンドウ」や「入力モード」など)の説明はまた後でするとして、コメントを見てもらえば、cursesライブラリを使うときの大雑把な流れが次のようになっていることが分かると思う:

  1. cursesライブラリの読み込み
  2. cursesライブラリの初期化
  3. ウィンドウを生成したり、文字を表示したり、入力を受け取ったりする
  4. cursesライブラリの終了処理

今日はここまで!