本文へ移動
mie リファレンス
REPL Playground

std:term/event リファレンス

@import 'std:term/event' で取得する端末入力デコードモジュール。read_key の生バイト列を矢印・マウス・修飾キー等の高水準イベントへデコードし、その構造的型 Event を型メンバーとして export する。

Event

{ kind: String, char: String, ctrl: Bool, shift: Bool, alt: Bool |}

端末入力イベントの構造的レコード型。kind を判別子に持ち、修飾は ctrl/shift/alt の
独立 Bool スロットで表す。5 スロットは全 Event 共通の契約 (キーイベントの形)。
マウスイベントは button/action/col/row を足した上位互換で、幅サブタイプにより
この型を満たす。各スロットの意味は docs/specs/std/term/event.md §1 が正とする。

>>> ev := @import "std:term/event"
>>> handler := {e : ev.Event | e.kind}

actions

actions
actions: { press, release, move |}

マウス action の正規値の定数 namespace (actions.press 等)。値は文字列そのもの。

>>> ev := @import "std:term/event"
>>> ev.actions.press

buttons

buttons
buttons: { left, middle, right, none, wheel_up, wheel_down |}

マウス button の正規値の定数 namespace (buttons.left 等)。値は文字列そのもの。

>>> ev := @import "std:term/event"
>>> ev.buttons.left

decode

decode(next_byte, peek_byte)
decode: { { Int | Future(Result(Int)) }, { Result(Int) } | { kind, char, ctrl, shift, alt |} }

バイト読取り 2 関数を注入して 1 イベントを組み立てる純関数 (実端末不要)。
next_byte は { Int | Future(Result(Int)) } (term.read_key 同形)、peek_byte は
{ | Result(Int) } (term.peek_key 同形)。戻り値は Event (kind + char + ctrl/shift/alt、
マウスは button/action/col/row)。

>>> ev := @import "std:term/event"
>>> ev.decode(read_byte, peek_byte)

kinds

kinds
kinds: { char, ctrl, enter, tab, backspace, esc, up, down, left, right, home, end, insert, delete, pageup, pagedown, f, mouse, eof |}

kind の正規値を名前で引く定数 namespace (kinds.up == "up" 等)。値は文字列
そのものなので == にも match パターンにも使える。綴り誤り (kinds.upp) は
スロット不在で評価時に失敗する。集合は docs/specs/std/term/event.md §1.1 と同一。

>>> ev := @import "std:term/event"
>>> ev.kinds.up

mouse_drag_off

mouse_drag_off
mouse_drag_off: { String }

マウス報告を無効化するエスケープ列 (mouse_drag_on と対)。

>>> ev := @import "std:term/event"
>>> ev.mouse_drag_off

mouse_drag_on

mouse_drag_on
mouse_drag_on: { String }

マウス報告を有効化するエスケープ列 (SGR 拡張・ドラッグ中のみ移動報告)。raw_mode の
内側で print する。有効化する DEC モードは press/release (1000)・button-event tracking
(1002)・SGR (1006)。1002 はボタン押下中の移動だけを報告し、待機中 (hover) の移動は
報告しない。ドラッグして塗る/選ぶ用途では mouse_on (1003) より移動イベントが激減し
応答が軽くなる。hover を追う必要がある UI だけ mouse_on を使う。

>>> ev := @import "std:term/event"
>>> ev.mouse_drag_on

mouse_off

mouse_off
mouse_off: { String }

マウス報告を無効化するエスケープ列 (mouse_on と対)。

>>> ev := @import "std:term/event"
>>> ev.mouse_off

mouse_on

mouse_on
mouse_on: { String }

マウス報告を有効化するエスケープ列 (SGR 拡張・全移動報告)。raw_mode の内側で print する。
有効化する DEC モードは press/release (1000)・any-event tracking (1003)・SGR (1006)。
1003 はボタン非押下の移動 (hover) も報告するため、hover を追う UI で使う。ドラッグ中
だけ移動が要る用途 (お絵かき等) は移動洪水を避けるため mouse_drag_on を使う。

>>> ev := @import "std:term/event"
>>> ev.mouse_on

next_event

next_event()
next_event: { Future({ kind, char, ctrl, shift, alt |}) }

std:term から 1 イベントを読み Future(Event) を返す。内部で
read_key/peek_key を使うのでアプリはバイト読取りを配線しなくてよい。
eof は失敗ではなくイベント (kind="eof") として届く。raw_mode の内側で使う。

>>> ev := @import "std:term/event"
>>> ev.next_event()