如何在 Rust 中使用 Termion 获取键盘输入?

Wal*_*oot 4 keyboard-input rust

我正在尝试 Rust,到目前为止我真的很喜欢它。我正在开发一个需要从用户那里获取箭头键输入的工具。到目前为止,我已经得到了一些半工作的东西:如果我按住某个键一段时间,相关的函数就会被调用。然而,这远非瞬时的。

到目前为止我所得到的:

let mut stdout = io::stdout().into_raw_mode();
let mut stdin = termion::async_stdin();
// let mut stdin = io::stdin();
let mut it = stdin.keys(); //iterator object

loop {
    //copied straight from GitLab: https://gitlab.redox-os.org/redox-os/termion/-/issues/168
    let b = it.next(); 
    match b {
        Some(x) => match x {
            Ok(k) => {
                match k {
                    Key::Left => move_cursor(&mut cursor_char, -1, &enc_chars, &mpt, &status),
                    Key::Right => move_cursor(&mut cursor_char, 1, &enc_chars, &mpt, &status),
                    Key::Ctrl('c') => break,
                    _ => {}
                }
            },  
            _ => {}
        },
        None => {}
    }
    //this loop might do nothing if no recognized key was pressed.
}
Run Code Online (Sandbox Code Playgroud)

我自己也不太明白。我正在使用终端原始模式,如果这与它有任何关系的话。我看过rustyline crate,但这确实没什么好处,因为它更像是一个交互式外壳,而我只想检测按键。

tra*_*tor 5

如果您使用原始输入模式并逐个按键读取,则需要使用已有的相同类型的匹配循环手动缓冲字符键。枚举变Key::Char(ch)体可用于匹配常规字符。然后,您可以使用可变String或数组[u8; MAX_SIZE]来存储字符数据并在键入字符时附加字符。如果用户移动光标,您需要跟踪输入缓冲区中的当前位置,并确保将新键入的字符插入到正确的位置,并根据需要移动现有字符。这是一项繁重的工作,这就是为什么有一些板条箱可以为你做这件事,但你控制输入行为的机会会更少。如果你想使用现有的板条箱,那么tui-rs检查完整的解决方案或linefeed更简单的解决方案可能是一个不错的选择。

至于延迟,我认为这可能是因为您正在使用 AsyncReader,根据文档,它正在使用辅助线程来执行阻塞读取