diff --git a/src/engine.rs b/src/engine.rs index 16cf9dcb..3e93a2a1 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -52,6 +52,12 @@ pub struct Engine { has_history: bool, } +pub enum Signal { + Success(String), + CtrlC, // Interrupt current editing + CtrlD, // End terminal session +} + pub fn print_message(stdout: &mut Stdout, msg: &str) -> Result<()> { stdout .queue(Print("\n"))? @@ -64,6 +70,13 @@ pub fn print_message(stdout: &mut Stdout, msg: &str) -> Result<()> { Ok(()) } +pub fn print_crlf(stdout: &mut Stdout) -> Result<()> { + stdout.queue(Print("\n"))?.queue(MoveToColumn(1))?; + stdout.flush()?; + + Ok(()) +} + fn buffer_repaint(stdout: &mut Stdout, engine: &Engine, prompt_offset: u16) -> Result<()> { let new_index = engine.get_insertion_point(); @@ -334,7 +347,8 @@ impl Engine { self.line_buffer.clear_range(range) } - pub fn read_line(&mut self, stdout: &mut Stdout) -> Result { + + pub fn read_line(&mut self, stdout: &mut Stdout) -> Result { // print our prompt stdout .execute(SetForegroundColor(Color::Blue))? @@ -353,7 +367,7 @@ impl Engine { }) => match code { KeyCode::Char('d') => { if self.line_buffer.is_empty() { - return Ok("exit".to_string()); + return Ok(Signal::CtrlD); } else { self.run_edit_commands(&[EditCommand::Delete]); } @@ -380,7 +394,8 @@ impl Engine { self.run_edit_commands(&[EditCommand::MoveRight]); } KeyCode::Char('c') => { - return Ok("".to_string()); + self.run_edit_commands(&[EditCommand::Clear]); + return Ok(Signal::CtrlC); } KeyCode::Char('h') => { self.run_edit_commands(&[EditCommand::Backspace]); @@ -466,7 +481,7 @@ impl Engine { EditCommand::Clear, ]); - return Ok(buffer); + return Ok(Signal::Success(buffer)); } KeyCode::Up => { self.run_edit_commands(&[EditCommand::PreviousHistory]); diff --git a/src/main.rs b/src/main.rs index 6afd75a6..b2a1d8ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use crossterm::{ mod line_buffer; mod engine; -use engine::{print_message, Engine}; +use engine::{print_crlf, print_message, Engine, Signal}; // this fn is totally ripped off from crossterm's examples // it's really a diagnostic routine to see if crossterm is @@ -59,13 +59,21 @@ fn main() -> Result<()> { let mut engine = Engine::new(); loop { - if let Ok(buffer) = engine.read_line(&mut stdout) { - if buffer.trim() == "exit" { - break; - } - - if !buffer.trim().is_empty() { - print_message(&mut stdout, &format!("Our buffer: {}", buffer))?; + if let Ok(sig) = engine.read_line(&mut stdout) { + match sig { + Signal::CtrlD => { + break; + } + Signal::Success(buffer) => { + if (buffer.trim() == "exit") || (buffer.trim() == "logout") { + break; + } + print_message(&mut stdout, &format!("Our buffer: {}", buffer))?; + } + Signal::CtrlC => { + // We need to move one line down to start with the prompt on a new line + print_crlf(&mut stdout)?; + } } } }