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

如何使用Rust中的Termion获取键盘输入?,rust,keyboard-input,Rust,Keyboard Input,我正在尝试生锈,到目前为止我真的很喜欢它。我正在开发一个工具,需要从用户那里获取箭头键输入。到目前为止,我有一个半工作:如果我按住一个键一段时间,就会调用相关函数。然而,这远远不是瞬间的 到目前为止,我得到的是: 让mut stdout=io::stdout()进入原始模式(); 让mut stdin=termion::async_stdin(); //让mut stdin=io::stdin(); 让mut it=stdin.keys()//迭代器对象 环路{ //直接从GitLab复制:ht

我正在尝试生锈,到目前为止我真的很喜欢它。我正在开发一个工具,需要从用户那里获取箭头键输入。到目前为止,我有一个半工作:如果我按住一个键一段时间,就会调用相关函数。然而,这远远不是瞬间的

到目前为止,我得到的是:

让mut stdout=io::stdout()进入原始模式();
让mut stdin=termion::async_stdin();
//让mut stdin=io::stdin();
让mut it=stdin.keys()//迭代器对象
环路{
//直接从GitLab复制:https://gitlab.redox-os.org/redox-os/termion/-/issues/168
设b=it.next();
比赛b{
一些(x)=>匹配x{
Ok(k)=>{
匹配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),
键::Ctrl('c')=>break,
_ => {}
}
},  
_ => {}
},
无=>{}
}
//如果没有按下可识别的键,此循环可能不会执行任何操作。
}

我自己也不太明白。我使用的是终端原始模式,如果这与此有关的话。我已经看过了,但这真的不好,因为它更像是一个交互式的shell,我只想检测按键。

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

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