To make io::stdin().read_line in Rust work with the <kbd>left arrow</kbd> key (and other terminal control keys like <kbd>right arrow</kbd>, <kbd>backspace</kbd>, etc.), you need to enable raw mode or use a library that handles terminal input properly. By default, read_line only works with basic line-buffered input and does not support arrow keys or other special keys.
crossterm LibraryThe crossterm library is a popular choice for handling terminal input in Rust, including arrow keys, function keys, and more.
Add crossterm to your Cargo.toml:
toml[dependencies] crossterm = "0.27"
Use crossterm to read key events:
Here’s an example of how to read input, including arrow keys:
rustuse crossterm::{ event::{self, Event, KeyCode}, terminal::{disable_raw_mode, enable_raw_mode}, }; use std::io; fn main() -> io::Result<()> { // Enable raw mode to read key events immediately enable_raw_mode()?; println!("Press 'q' to quit. Use arrow keys to move."); loop { // Wait for an event if let Event::Key(key_event) = event::read()? { match key_event.code { KeyCode::Left => println!("Left arrow pressed!"), KeyCode::Right => println!("Right arrow pressed!"), KeyCode::Char('q') => break, _ => {} } } } // Disable raw mode before exiting disable_raw_mode()?; Ok(()) }
enable_raw_mode: Puts the terminal in raw mode, allowing you to read key presses immediately (without waiting for Enter).event::read: Reads the next terminal event (e.g., key press).KeyCode::Left: Matches the left arrow key. Similarly, you can match KeyCode::Right, KeyCode::Up, KeyCode::Down, etc.disable_raw_mode: Restores the terminal to its original state.termionIf you prefer, you can also use the termion library, which is another great option for terminal handling in Rust. The approach is similar to crossterm.
Vibe can make mistakes. Check answers. Learn more