For Development HEAD DRAFTSearch (procedure/syntax/module):

12.63 text.console - テキスト端末制御

Module: text.console

このモジュールは文字端末を制御する簡単なインタフェースを提供します。 今のところ、vt100互換端末とWindowsコンソールがサポートされています。

curses等の外部ライブラリには依存しておらず、Gaucheだけで使うことができますが、 出来ることは限られています。 例えばシフトキーだけが押されたタイミングでイベントを受け取ることはできません。 より細かい制御には、何らかの外部拡張ライブラリが必要になるでしょう。

このモジュールの機能の例としては、 Gaucheソースのexamplesディレクトリにあるsnake.scmを見てください。

コンソールオブジェクト

Class: <vt100>

{text.console} vt100互換端末を表します。このクラスのインスタンスは 以降のジェネリックファンクションの “console” 引数に渡せます。

Instance Variable of <vt100>: iport

端末に接続されている入力ポートです。デフォルトは標準入力です。

Instance Variable of <vt100>: oport

端末に接続されている出力ポートです。デフォルトは標準出力です。

Instance Variable of <vt100>: input-delay

端末は、特殊キーが押された場合、ESCから始まるエスケープシーケンスを送って来ます。 実際にESCキーが押された場合と区別するために、入力の間隔を測っています。 後続の入力がinput-delayμs以内に来なかった場合はそこでシーケンスが終了したと みなし、受け取っているシーケンスが有効なエスケープシーケンスを構成しなければ 個別にキー入力されたとみなします。デフォルトは1000、すなわち1msです。

Class: <windows-console>

Windowsコンソールを表します。このクラス自体は全てのプラットフォームで 定義されていますが、有用なメソッドはWindowsネイティブのランタイムでしか提供されません。

パブリックなスロットはありません。

アプリケーションは実行時にどの種類のコンソールが利用可能かを見極めなければなりません。 推奨される手順は次のとおりです。

次の手続きは上の手順を実装しています。

Function: make-default-console :key if-not-available

{text.console} 実行中のプロセスで使える端末のインスタンスを作成して返します。

適切な端末クラスが無い場合、振る舞いはif-not-availableキーワード引数に 依存します。デフォルトである:errorの場合はエラーが報告されます。 #fの場合はこの手続きが#fを返します。

Function: vt100-compatible? string

{text.console} 環境変数TERMの値を文字列で受け取り、それが<vt100>端末として 扱えるなら#tを、そうでなければ#fを返します。

コンソール制御

Generic function: call-with-console console proc :key mode

{text.console} コンソールの制御を取得した状態で、procconsoleを唯一の引数として 呼び出します。コンソールはmodeで指定されるモードにセットされます。 modewith-terminal-modeが受け付けるシンボル、 すなわちrawrarecookedのいずれかでなければなりません。 省略された場合はrareになります。 このモードは、端末でのエコーを抑止し、ほぼ全てのキーストロークを プログラムにそのまま渡しますが、端末制御機能はシステム側で処理します (割り込みのCtrl-C、プロセス一時停止のCtrl-Zなど。実際のキー割り当ては 端末制御で変更可能です。詳しくはgauche.termios - 端末の制御参照。)

procが捕捉されない例外を投げた場合、このジェネリック関数は 端末モードを元に戻します。ただ、スクリーンはクリアされません。

Generic function: putch console char

{text.console} 文字charをコンソールの現在のカーソル位置に出力し、カーソルをその分進めます。

Generic function: putstr console string

{text.console} 文字列stringコンソールの現在のカーソル位置に出力し、カーソルをその分進めます。

Generic function: beep console

{text.console} 可能なら、端末のビープ音を鳴らすか、画面をフラッシュさせます(visual bell)。

Generic function: getch console

{text.console} コンソールからキー入力を読み取ります。何らかのキーが押されるまでブロックします。

戻り値は以下の値のいずれかです。

文字

その文字に該当するキーが押された場合。 コントロールキーと一緒に押された場合は、制御文字が返ります。 例えばユーザがCtrl-Aをタイプしたら#\x01が返ります。

シンボル

特殊キーの場合です。以下のキーがサポートされています。 KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_INS, KEY_DEL, KEY_PGDN, KEY_PGUP, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12。 (註: DELETEキーは通常#\x7fにマップされていますが、 端末設定で変更可能です)。

シンボルALTと文字のリスト

文字キーがAltキーと同時に押されたことを示します。 例えばユーザがAlt-aを押したなら、(ALT #\a)が返されます。

EOF

入力がクローズされたことを示します。

ALT以外のモディファイアキーは別扱いではなく返される文字コードにエンコードされます。 CAPSLOCKがoffであるとき、ユーザが aShift+aCtrl+aをタイプしたとすると、 戻り値はそれぞれ#\a#\A#\x01となります。 Ctrl+Shift+aCtrl+aと区別できません。 ALT+aALT+Shift+aALT+Ctrl+aの戻り値はそれぞれ、 (ALT #\a)(ALT #\A)(ALT #\x01)となります。

Generic function: chready? console

{text.console} コンソールの入力からキーシーケンスが直ちに読み出せる状態であれば#tを、 そうでなければ#fを返します。

Generic function: query-cursor-position console

{text.console} コンソールのカーソル位置を問い合わせ、そのx座標とy座標を2つの値として 返します。左上のコーナーが(0, 0)です。

Generic function: move-cursor-to console row column

{text.console} カーソルを指定位置に移動します。左上のコーナーが(0, 0)です。

Generic function: reset-terminal console

{text.console} 端末をリセットします。通常、これは文字属性をデフォルトに戻し、 スクリーンをクリアしてカーソルを(0, 0)に移動します。

Generic function: clear-screen console

{text.console} 全画面をクリアします。

Generic function: clear-to-eol console

{text.console} 現在のカーソル位置から行末までをクリアします。

Generic function: clear-to-eos console

{text.console} 現在のカーソル位置とそれ以降をクリアします。

Generic function: hide-cursor console
Generic function: show-cursor console

{text.console} カーソルを隠す、あるいは表示します。

Generic function: cursor-down/scroll-up console

{text.console} カーソルが画面の一番下の行にある場合は、画面全体をスクロールアップし、最下行をクリアします。 カーソルは同じ位置にとどまります。 そうでなければ、カーソルを同じカラムの一行下に移動します。

Generic function: cursor-up/scroll-down console

{text.console} カーソルが画面の一番上の行にある場合は、画面全体をスクロールダウンし、最上行をクリアします。 カーソルは同じ位置にとどまります。 そうでなければ、カーソルを同じカラムの一行上に移動します。

Generic function: query-screen-size console

{text.console} スクリーンの幅と高さを2つの値で返します。

註: この操作は画面上の表示に影響を与えるかもしれません。 画面全体を再描画する前にこの呼び出しを行い、結果を保存しておくことをおすすめします。

Generic function: set-character-attribute console attr

{text.console} これ以降に書かれる文字の文字属性をattrに設定します。

文字属性attrは次の形式のリストです。

(<fgcolor> [<bgcolor> . <option> ...])

ここで、

<fgcolor> : <color> | #f     ; #f means default
<bgcolor> : <color> | #f
<color>  : black | red | green | yellow | blue | magenta | cyan | white
<option> : bright | reverse | underscore

例えば、以降の文字を黒背景に赤字、下線つきで表示したい場合は、こう呼び出します:

(set-character-attribute con '(red black underscore))

フルカラービットマップディスプレイが一般的になった現代では、 指定可能な属性がひどく限られているように感じられるかもしれません。 昔はみなこういうものだったのじゃよ、若者よ。

Generic function: reset-character-attribute console

{text.console} 文字属性をデフォルトに戻します。

Generic function: with-character-attribute console attr thunk

{text.console} コンソールの文字属性をattrに変更した上でthunkを呼び出し、 その後で文字属性をデフォルトに戻します。thunkがエラーを投げた場合でも 文字属性は戻されます。

attrの形式については上のset-character-attributeを 参照してください。

註: この手続きはネストして使えるべきですが、今の所ネストは動きません。 一番内側のwith-character-attributeが終わった時点で 属性がリセットされてしまいます。 



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT