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

いものやま。

雑多な知識の寄せ集め

Curses for Ruby。(まとめ)

技術 Ruby 端末 Curses まとめ

これまでの各記事は以下から。

以下、サマリー。

全体の流れ

cursesライブラリを使うときの全体の流れは、以下の通り:

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

ライブラリの初期化はCurses.#init_screen()、終了処理はCurses.#close_screen()で行う。

画面サイズの取得

メソッド 説明
Curses.#lines() 画面の行数を返す。
Curses.#cols() 画面の列数を返す。

ウィンドウ

ウィンドウは、画面に出力する文字情報を持った矩形の領域。

メソッド 説明
生成・削除
Curses.#stdscr() 画面全体を覆うデフォルトのウィンドウを返す。
Curses::Window.new(height, width, top, left) 高さがheight行、幅がwidth列で、左上の位置が画面のtop行目、left列目であるような新しいウィンドウが生成し、そのインスタンスを返す。
Curses::Window#close() ウィンドウを削除し、メモリを解放する。
サイズ
Curses::Window#maxy() ウィンドウの行数を返す。
Curses::Window#maxx() ウィンドウの列数を返す。
Curses::Window#resize(height, width) ウィンドウのサイズをheightwidth列に変更する。
位置と移動
Curses::Window#begy() ウィンドウの左上が、画面の何行目にあるかを返す。
Curses::Window#begx() ウィンドウの左上が、画面の何列目にあるかを返す。
Curses::Window#move(top, left) ウィンドウの左上がtopleft列目になるように移動する。
カーソル
Curses::Window#cury() カーソルがウィンドウの何行目にあるかを返す。
Curses::Window#curx() カーソルがウィンドウの何列目にあるかを返す。
Curses::Window#setpos(y, x) カーソル位置をウィンドウのyx列目にする。
Curses.#curs_set(visibility) visibilityが0の場合、カーソルが非表示になる。
visibilityが1の場合、カーソルが表示される。
文字の追加・削除
Curses::Window#addch(ch) ウィンドウのカーソル位置に文字chを上書きし、カーソルを進める。
Curses::Window#addstr(str)
Curses::Window#<<(str)
ウィンドウのカーソル位置に文字列strを上書きし、カーソルを進める。
Curses::Window#insch(ch) ウィンドウのカーソル位置に文字chを挿入する。
Curses::Window#insertln() ウィンドウのカーソル位置に一行挿入する。
Curses::Window#delch() ウィンドウのカーソル位置の文字を削除する。(以降の文字は前に詰められる)
Curses::Window#deleteln() ウィンドウのカーソル位置の行を削除する。(以降の行は前に詰められる)
Curses::Window#clear() ウィンドウの内容をすべて削除する。
Curses::Window#clrtoeol() ウィンドウのカーソル位置から行末までを削除する。
Curses::Window#box(vert, hor) ウィンドウの矩形領域の一番外側を枠で囲う。このとき、垂直方向には文字vert、水平方向には文字horが使われる。
画面への反映
Curses::Window#refresh() ウィンドウの変更を仮想画面と画面へ反映する。
Curses::Window#noutrefresh() ウィンドウの変更を仮想画面へ反映する。(画面へは反映されない)
Curses.#doupdate() 仮想画面の内容を画面へ反映する。

画面への反映はややクセがあるので、Curses for Ruby。(その3) - いものやま。Curses for Ruby。(その4) - いものやま。も参照。

文字の入力

文字の入力には、入力モードが関係してくる:

  • cookedモード
    通常の入力と同じように、バッファリングを行う状態。
    Enterキーが押されるまでは、入力されたデータはユーザプログラムに渡ってこない。
  • cbreakモード
    バッファリングを行わない状態。
    入力された文字は即座にユーザプログラムに渡される。
  • rawモード
    バッファリングを行わず、さらに通常はshellで解釈される特殊な文字(Ctrl+CやCtrl+Zなど)をユーザプログラム側で扱えるようにする。
メソッド 説明
モードの切り替え
Curses.#nocbreak()
Curses.#nocrmode()
Curses.#noraw()
入力モードをcookedモードにする。
Curses.#cbreak()
Curses.#crmode()
入力モードをcbreakモードにする。
Curses.#raw() 入力モードをrawモードにする。
エコーバック
Curses.#echo() 入力のエコーバックを有効にする。
Curses.#noecho() 入力のエコーバックを無効にする。
入力の取得
Curses::Window#getch() ユーザの入力から一文字読み込んで返す。
Curses::Window#getstr() ユーザの入力から一行読み込んで返す。
(cbreakモードやrawモードでも、Enterキーが押されて一行になるまではブロッキングされる)
その他
Curses::Window#ungetch(ch) 文字chをバッファの先頭に戻す。
戻せるのは一文字まで。
Curses::Window#inch() カーソル位置の文字を読み込んで返す。
Curses::Window#keypad(bool) booltrueの場合、キーパッドが有効になる。
すなわち、カーソルキーやファンクションキーの入力が、Curses::KEY_*(あるいはCurses::Key::*)という定数で返ってくるようになる。

入力待ちのタイムアウト

入力待ちのタイムアウトを設定するには、次のメソッドを使う:

Curses::Window#timeout=(val)
ウィンドウの入力待ちについて、タイムアウトを設定する。

  • valが負の値の場合、ブロッキングされる。
  • valが0の場合、ノンブロッキングになる。
  • valが正の値の場合、入力を最大valミリ秒待つようになる。

上記のメソッドの場合、タイムアウトするまでの時間を設定しているので、それよりも前に入力があった場合には即座にユーザプログラムに制御が戻ってくる。
ただ、場合によっては、ユーザからの入力があってもなくても常に一定時間待って、そのあと処理を行いたいということもあるかと思う。
そういった場合には、timeoutライブラリを使うといい。

出力文字の修飾

これはちょっとややこしいし、使うのも稀だと思うので、Curses for Ruby。(その6) - いものやま。を参照。

今日はここまで!