fix: event-read-char-line double read error & auto enter (#954)

This commit is contained in:
Hanggang Zhu 2025-02-02 18:12:35 +08:00 committed by GitHub
parent 1e7622c1dc
commit fe96fefd41
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,12 +5,13 @@
use std::io; use std::io;
use crossterm::event::{self, Event, KeyCode, KeyEvent}; use crossterm::{event::{self, Event, KeyCode, KeyEvent, KeyEventKind}, terminal};
pub fn read_char() -> io::Result<char> { pub fn read_char() -> io::Result<char> {
loop { loop {
if let Event::Key(KeyEvent { if let Event::Key(KeyEvent {
code: KeyCode::Char(c), code: KeyCode::Char(c),
kind: KeyEventKind::Press,
.. ..
}) = event::read()? }) = event::read()?
{ {
@ -21,24 +22,36 @@ pub fn read_char() -> io::Result<char> {
pub fn read_line() -> io::Result<String> { pub fn read_line() -> io::Result<String> {
let mut line = String::new(); let mut line = String::new();
while let Event::Key(KeyEvent { code, .. }) = event::read()? { loop {
match code { if let Event::Key(KeyEvent{
KeyCode::Enter => { code,
break; kind: KeyEventKind::Press,
..
}) = event::read()? {
match code {
KeyCode::Enter => {
break;
}
KeyCode::Char(c) => {
line.push(c);
}
_ => {}
} }
KeyCode::Char(c) => {
line.push(c);
}
_ => {}
} }
} }
Ok(line) Ok(line)
} }
fn main() { fn main() -> io::Result<()> {
println!("read line:"); terminal::enable_raw_mode()?;
println!("{:?}", read_line());
println!("read char:"); println!("read line:\r");
println!("{:?}", read_char()); println!("{:?}\r", read_line());
println!("read char:\r");
println!("{:?}\r", read_char());
println!("read char again:\r");
println!("{:?}\r", read_char());
terminal::disable_raw_mode()
} }