text.console - テキスト端末制御 ¶このモジュールは文字端末を制御する簡単なインタフェースを提供します。 今のところ、vt100互換端末とWindowsコンソールがサポートされています。
curses等の外部ライブラリには依存しておらず、Gaucheだけで使うことができますが、
出来ることは限られています。
例えばシフトキーだけが押されたタイミングでイベントを受け取ることはできません。
より細かい制御には、何らかの外部拡張ライブラリが必要になるでしょう。
このモジュールの機能の例としては、 Gaucheソースのexamplesディレクトリにあるsnake.scmを見てください。
{text.console}
vt100互換端末を表します。このクラスのインスタンスは
以降のジェネリックファンクションの “console” 引数に渡せます。
<vt100>: iport ¶端末に接続されている入力ポートです。デフォルトは標準入力です。
<vt100>: oport ¶端末に接続されている出力ポートです。デフォルトは標準出力です。
<vt100>: input-delay ¶端末は、特殊キーが押された場合、ESCから始まるエスケープシーケンスを送って来ます。
実際にESCキーが押された場合と区別するために、入力の間隔を測っています。
後続の入力がinput-delayμs以内に来なかった場合はそこでシーケンスが終了したと
みなし、受け取っているシーケンスが有効なエスケープシーケンスを構成しなければ
個別にキー入力されたとみなします。デフォルトは1000、すなわち1msです。
Windowsコンソールを表します。このクラス自体は全てのプラットフォームで 定義されていますが、有用なメソッドはWindowsネイティブのランタイムでしか提供されません。
パブリックなスロットはありません。
アプリケーションは実行時にどの種類のコンソールが利用可能かを見極めなければなりません。 推奨される手順は次のとおりです。
has-windows-console?が真の値を返したなら、<windows-console>の
インスタンスを作ります。
has-windows-console?はWindowsプラットフォーム以外では常に#fを
返すので、cond-expandは不要です。
TERMを調べます。それが定義されていて、vt100-compatible?を
満たすなら、<vt100>のインスタンスを作ります。
(Windows上でも<vt100>端末を使うことになる可能性もあります。
例えばgoshがMSYSシェルから使われている場合です。)
次の手続きは上の手順を実装しています。
{text.console}
実行中のプロセスで使える端末のインスタンスを作成して返します。
適切な端末クラスが無い場合、振る舞いはif-not-availableキーワード引数に
依存します。デフォルトである:errorの場合はエラーが報告されます。
#fの場合はこの手続きが#fを返します。
{text.console}
環境変数TERMの値を文字列で受け取り、それが<vt100>端末として
扱えるなら#tを、そうでなければ#fを返します。
{text.console}
コンソールの制御を取得した状態で、procをconsoleを唯一の引数として
呼び出します。コンソールはmodeで指定されるモードにセットされます。
modeはwith-terminal-modeが受け付けるシンボル、
すなわちraw、rare、cookedのいずれかでなければなりません。
省略された場合はrareになります。
このモードは、端末でのエコーを抑止し、ほぼ全てのキーストロークを
プログラムにそのまま渡しますが、端末制御機能はシステム側で処理します
(割り込みのCtrl-C、プロセス一時停止のCtrl-Zなど。実際のキー割り当ては
端末制御で変更可能です。詳しくはgauche.termios - 端末の制御参照。)
procが捕捉されない例外を投げた場合、このジェネリック関数は 端末モードを元に戻します。ただ、スクリーンはクリアされません。
{text.console}
文字charをコンソールの現在のカーソル位置に出力し、カーソルをその分進めます。
{text.console}
文字列stringコンソールの現在のカーソル位置に出力し、カーソルをその分進めます。
{text.console}
可能なら、端末のビープ音を鳴らすか、画面をフラッシュさせます(visual bell)。
{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)が返されます。
入力がクローズされたことを示します。
ALT以外のモディファイアキーは別扱いではなく返される文字コードにエンコードされます。
CAPSLOCKがoffであるとき、ユーザが
a、Shift+a、Ctrl+aをタイプしたとすると、
戻り値はそれぞれ#\a、#\A、#\x01となります。
Ctrl+Shift+aはCtrl+aと区別できません。
ALT+a、ALT+Shift+a、
ALT+Ctrl+aの戻り値はそれぞれ、
(ALT #\a)、(ALT #\A)、(ALT #\x01)となります。
{text.console}
コンソールの入力からキーシーケンスが直ちに読み出せる状態であれば#tを、
そうでなければ#fを返します。
{text.console}
コンソールのカーソル位置を問い合わせ、そのx座標とy座標を2つの値として
返します。左上のコーナーが(0, 0)です。
{text.console}
カーソルを指定位置に移動します。左上のコーナーが(0, 0)です。
{text.console}
端末をリセットします。通常、これは文字属性をデフォルトに戻し、
スクリーンをクリアしてカーソルを(0, 0)に移動します。
{text.console}
全画面をクリアします。
{text.console}
現在のカーソル位置から行末までをクリアします。
{text.console}
現在のカーソル位置とそれ以降をクリアします。
{text.console}
カーソルを隠す、あるいは表示します。
{text.console}
カーソルが画面の一番下の行にある場合は、画面全体をスクロールアップし、最下行をクリアします。
カーソルは同じ位置にとどまります。
そうでなければ、カーソルを同じカラムの一行下に移動します。
{text.console}
カーソルが画面の一番上の行にある場合は、画面全体をスクロールダウンし、最上行をクリアします。
カーソルは同じ位置にとどまります。
そうでなければ、カーソルを同じカラムの一行上に移動します。
{text.console}
スクリーンの幅と高さを2つの値で返します。
註: この操作は画面上の表示に影響を与えるかもしれません。 画面全体を再描画する前にこの呼び出しを行い、結果を保存しておくことをおすすめします。
{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))
フルカラービットマップディスプレイが一般的になった現代では、 指定可能な属性がひどく限られているように感じられるかもしれません。 昔はみなこういうものだったのじゃよ、若者よ。
{text.console}
文字属性をデフォルトに戻します。
{text.console}
コンソールの文字属性をattrに変更した上でthunkを呼び出し、
その後で文字属性をデフォルトに戻します。thunkがエラーを投げた場合でも
文字属性は戻されます。
attrの形式については上のset-character-attributeを
参照してください。
註: この手続きはネストして使えるべきですが、今の所ネストは動きません。
一番内側のwith-character-attributeが終わった時点で
属性がリセットされてしまいます。