demo/
demo.rs

1use std::time::Duration;
2
3use crossterm::cursor::{self};
4use crossterm::event::{self, KeyCode};
5use crossterm::terminal::{disable_raw_mode, enable_raw_mode};
6use crossterm::{execute, terminal};
7use string_cmd::events::event_to_command;
8use string_cmd::StringEditor;
9
10fn main() -> std::io::Result<()> {
11    let mut editor = StringEditor::new();
12    let mut stdout = std::io::stdout();
13
14    println!("Enter text below:");
15    enable_raw_mode()?;
16
17    let input = loop {
18        if event::poll(Duration::from_millis(10))? {
19            let event = event::read()?;
20            if let event::Event::Key(key) = &event {
21                let ctrl = key.modifiers.contains(event::KeyModifiers::CONTROL);
22
23                match key.code {
24                    KeyCode::Esc => break None,
25                    KeyCode::Char('q') if ctrl => break None,
26                    KeyCode::Enter => break Some(editor.get_text()),
27                    _ => {}
28                }
29            }
30
31            if let Some(command) = event_to_command(&event) {
32                editor.execute(command);
33            }
34        }
35
36        execute!(
37            stdout,
38            cursor::MoveToColumn(0),
39            terminal::Clear(terminal::ClearType::CurrentLine)
40        )?;
41        print!("{}", editor.get_text());
42        execute!(stdout, cursor::MoveToColumn(editor.cursor_pos() as u16))?;
43    };
44
45    disable_raw_mode()?;
46    println!("\nGot input: {:?}", input);
47
48    Ok(())
49}