これまでの各記事は以下から。
- インストールと動作確認
- cursesライブラリの初期化・終了と、構成要素
- ウィンドウの描画について
- 文字の入力について
- 出力の装飾について
以下、サマリー。
全体の流れ
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) |
ウィンドウのサイズをheight 行width 列に変更する。 |
位置と移動 | |
Curses::Window#begy() |
ウィンドウの左上が、画面の何行目にあるかを返す。 |
Curses::Window#begx() |
ウィンドウの左上が、画面の何列目にあるかを返す。 |
Curses::Window#move(top, left) |
ウィンドウの左上がtop 行left 列目になるように移動する。 |
カーソル | |
Curses::Window#cury() |
カーソルがウィンドウの何行目にあるかを返す。 |
Curses::Window#curx() |
カーソルがウィンドウの何列目にあるかを返す。 |
Curses::Window#setpos(y, x) |
カーソル位置をウィンドウのy 行x 列目にする。 |
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) |
bool がtrue の場合、キーパッドが有効になる。すなわち、カーソルキーやファンクションキーの入力が、 Curses::KEY_* (あるいはCurses::Key::* )という定数で返ってくるようになる。 |
入力待ちのタイムアウト
入力待ちのタイムアウトを設定するには、次のメソッドを使う:
Curses::Window#timeout=(val)
ウィンドウの入力待ちについて、タイムアウトを設定する。
上記のメソッドの場合、タイムアウトするまでの時間を設定しているので、それよりも前に入力があった場合には即座にユーザプログラムに制御が戻ってくる。
ただ、場合によっては、ユーザからの入力があってもなくても常に一定時間待って、そのあと処理を行いたいということもあるかと思う。
そういった場合には、timeoutライブラリを使うといい。
出力文字の修飾
これはちょっとややこしいし、使うのも稀だと思うので、Curses for Ruby。(その6) - いものやま。を参照。
今日はここまで!