From bb6862d123eec43256e985578af9b04e9c63804c Mon Sep 17 00:00:00 2001 From: emma Date: Tue, 11 Apr 2023 16:53:02 -0400 Subject: [PATCH 1/3] added append mode --- src/main.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 94690b6..dc5a3d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,7 @@ use std::io::{ stdin, stdout, Read, Stdout, Write }; use crossterm::{ cursor, - event::{Event, KeyCode, KeyEvent} + event::{ Event, KeyCode, KeyEvent, read }, terminal, ExecutableCommand, Result @@ -116,6 +116,7 @@ enum Mode { Normal, Command, Visual, + Append, Insert, } @@ -125,6 +126,7 @@ impl Mode { match self { Mode::Normal => Style::SteadyBlock, Mode::Visual => Style::BlinkingBlock, + Mode::Append => Style::BlinkingBar, Mode::Insert => Style::BlinkingBar, Mode::Command => Style::SteadyUnderScore, } @@ -174,6 +176,7 @@ impl State { Mode::Normal => self.on_normal_event(event), Mode::Command => self.on_command_event(event), Mode::Visual => self.on_visual_event(event), + Mode::Append => self.on_append_event(event), Mode::Insert => self.on_insert_event(event), } } @@ -184,6 +187,10 @@ impl State { KeyCode::Char('i') => { self.mode = Mode::Insert; } + KeyCode::Char('a') => { + self.move_cursor(Direction::Right); + self.mode = Mode::Append; + } KeyCode::Char(':') => { self.mode = Mode::Command; } @@ -223,6 +230,19 @@ impl State { } } + fn on_append_event(&mut self, event: Event) { + match event { + Event::Key(KeyEvent { code, .. }) => match code { + KeyCode::Esc => { + self.move_cursor(Direction::Left); + self.mode = Mode::Normal; + } + _ => self.on_insert_event(event), + }, + _ => {} + } + } + fn on_insert_event(&mut self, event: Event) { match event { Event::Key(KeyEvent { code, .. }) => match code { @@ -274,7 +294,7 @@ impl State { fn screen_main(stdout: &mut Stdout, mut state: State) -> Result<()> { while !state.quit { state.draw(stdout)?; - let event = event::read()?; + let event = read()?; state.on_event(event); } From e06d61317f0a97554ea5b29c5fd6b3030d4bd82c Mon Sep 17 00:00:00 2001 From: emma Date: Tue, 11 Apr 2023 17:06:11 -0400 Subject: [PATCH 2/3] small formatting issue --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 9f67f1c..c6442ed 100644 --- a/src/main.rs +++ b/src/main.rs @@ -240,7 +240,7 @@ impl State { self.move_cursor(Direction::Left); self.mode = Mode::Normal; } - _ => self.on_insert_event(event), + _ => self.on_insert_event(event), }, _ => {} } From 1be955dc11a2247baa80f69da83dd143221f1e0e Mon Sep 17 00:00:00 2001 From: emma Date: Tue, 11 Apr 2023 17:28:42 -0400 Subject: [PATCH 3/3] fixed append --- src/main.rs | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index c6442ed..d4506f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,14 +113,18 @@ struct Cursor { pub line: usize, } +#[derive(Copy, Clone, Debug)] +struct InsertState { + append: bool, +} + #[derive(Copy, Clone, Debug, Default)] enum Mode { #[default] Normal, Command, Visual, - Append, - Insert, + Insert(InsertState), } impl Mode { @@ -129,8 +133,7 @@ impl Mode { match self { Mode::Normal => Style::SteadyBlock, Mode::Visual => Style::BlinkingBlock, - Mode::Append => Style::BlinkingBar, - Mode::Insert => Style::BlinkingBar, + Mode::Insert(_) => Style::BlinkingBar, Mode::Command => Style::SteadyUnderScore, } } @@ -179,8 +182,7 @@ impl State { Mode::Normal => self.on_normal_event(event), Mode::Command => self.on_command_event(event), Mode::Visual => self.on_visual_event(event), - Mode::Append => self.on_append_event(event), - Mode::Insert => self.on_insert_event(event), + Mode::Insert(state) => self.on_insert_event(event, state), } } @@ -188,11 +190,13 @@ impl State { match event { Event::Key(KeyEvent { code, .. }) => match code { KeyCode::Char('i') => { - self.mode = Mode::Insert; + let state = InsertState { append: false }; + self.mode = Mode::Insert(state); } KeyCode::Char('a') => { + let state = InsertState { append: true, }; self.move_cursor(Direction::Right); - self.mode = Mode::Append; + self.mode = Mode::Insert(state); } KeyCode::Char(':') => { self.mode = Mode::Command; @@ -233,20 +237,7 @@ impl State { } } - fn on_append_event(&mut self, event: Event) { - match event { - Event::Key(KeyEvent { code, .. }) => match code { - KeyCode::Esc => { - self.move_cursor(Direction::Left); - self.mode = Mode::Normal; - } - _ => self.on_insert_event(event), - }, - _ => {} - } - } - - fn on_insert_event(&mut self, event: Event) { + fn on_insert_event(&mut self, event: Event, state: InsertState) { match event { Event::Key(KeyEvent { code, .. }) => match code { KeyCode::Char(c) => { @@ -270,6 +261,9 @@ impl State { self.cursor.column = 0; } KeyCode::Esc => { + if state.append { + self.move_cursor(Direction::Left); + } self.mode = Mode::Normal; } code => self.match_any_key(code),