イケてる tui を作ってみる part2
今回は標準入力を試してみます
🎵 本日の一曲
たまたま目に入ったので
百合注意
やっぱ琴葉姉妹百合最高だよな
...
リアルタイムで標準入力を受け取ってみよう
こんなかんじ
use std::{
io::{Result, Write, stdin, stdout},
thread::sleep,
time::Duration,
};
use crossterm::{
cursor::{MoveTo, MoveToNextLine},
event::{
EnableBracketedPaste, EnableFocusChange, EnableMouseCapture, Event, KeyEvent,
KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, poll,
read,
},
execute, queue,
style::Print,
terminal::{Clear, ClearType, enable_raw_mode, size},
};
fn main() -> Result<()> {
// 色々な機能を無効にする
_ = enable_raw_mode();
// printlnなどの動作がおかしくなるので、crosstermの関数を使うようにする。
let mut stdout = stdout();
loop {
// 入力イベントの処理
if poll(Duration::from_millis(100))? {
if let Event::Key(event) = read()? {
execute!(stdout, MoveTo(0, 0), Print(format!("{:?}", event)))?
}
}
}
}
とりあえずキーイベント only
KeyEvent {
code: Char('a'),
modifiers: KeyModifiers(0x0),
kind: Press,
state: KeyEventState(0x0)
}
こんな感じの構造体が event の中に入ってる。
note
raw モードにしないと、enter を受け取るまで入力を待機してしまう
note
poll 関数を挟むと、(上記の例だと)100ms まって入力がなければ、false を返す(=イベントの処理をスキップする)
イベント楽しい
main 関数に設置した loop 文で、入力、処理、出力を繰り返す。 これを応用すると、ゲームとか作れる
おわり
subnautica、シーモス食われました。
資材集め大変です。