diff --git a/src/edit/editor.rs b/src/edit/editor.rs index 3d26bbf..4f33cd0 100644 --- a/src/edit/editor.rs +++ b/src/edit/editor.rs @@ -75,6 +75,13 @@ impl<'a> Edit<'a> for Editor<'a> { self.select_opt } + fn set_select_opt(&mut self, select_opt: Option) { + if self.select_opt != select_opt { + self.select_opt = select_opt; + self.buffer.set_redraw(true); + } + } + fn shape_as_needed(&mut self) { if self.cursor_moved { self.buffer.shape_until_cursor(self.cursor); diff --git a/src/edit/mod.rs b/src/edit/mod.rs index fc53457..66acee0 100644 --- a/src/edit/mod.rs +++ b/src/edit/mod.rs @@ -73,6 +73,9 @@ pub trait Edit<'a> { /// Get the current selection position fn select_opt(&self) -> Option; + /// Set the current selection position + fn set_select_opt(&mut self, select_opt: Option); + /// Shape lines until scroll, after adjusting scroll if the cursor moved fn shape_as_needed(&mut self); diff --git a/src/edit/syntect.rs b/src/edit/syntect.rs index 09dde13..88c4280 100644 --- a/src/edit/syntect.rs +++ b/src/edit/syntect.rs @@ -160,6 +160,10 @@ impl<'a> Edit<'a> for SyntaxEditor<'a> { fn select_opt(&self) -> Option { self.editor.select_opt() } + + fn set_select_opt(&mut self, select_opt: Option) { + self.editor.set_select_opt(select_opt); + } fn shape_as_needed(&mut self) { #[cfg(feature = "std")] diff --git a/src/edit/vi.rs b/src/edit/vi.rs index 1d8ea2e..155aa0d 100644 --- a/src/edit/vi.rs +++ b/src/edit/vi.rs @@ -67,6 +67,10 @@ impl<'a> Edit<'a> for ViEditor<'a> { self.editor.select_opt() } + fn set_select_opt(&mut self, select_opt: Option) { + self.editor.set_select_opt(select_opt); + } + fn shape_as_needed(&mut self) { self.editor.shape_as_needed() } @@ -95,6 +99,23 @@ impl<'a> Edit<'a> for ViEditor<'a> { self.editor.action(Action::End); self.mode = Mode::Insert; }, + // Change mode + 'c' => { + if self.editor.select_opt().is_some() { + self.editor.action(Action::Delete); + self.mode = Mode::Insert; + } else { + //TODO: change to next cursor movement + } + }, + // Delete mode + 'd' => { + if self.editor.select_opt().is_some() { + self.editor.action(Action::Delete); + } else { + //TODO: delete to next cursor movement + } + }, // Enter insert mode at cursor 'i' => { self.mode = Mode::Insert; @@ -133,6 +154,25 @@ impl<'a> Edit<'a> for ViEditor<'a> { //TODO: 'L' => self.editor.action(Action::ScreenLow), // Middle of screen //TODO: 'M' => self.editor.action(Action::ScreenMiddle), + // Enter visual mode + 'v' => { + if self.editor.select_opt().is_some() { + self.editor.set_select_opt(None); + } else { + self.editor.set_select_opt(Some(self.editor.cursor())); + } + }, + // Enter line visual mode + 'V' => { + if self.editor.select_opt().is_some() { + self.editor.set_select_opt(None); + } else { + self.editor.action(Action::Home); + self.editor.set_select_opt(Some(self.editor.cursor())); + //TODO: set cursor_x_opt to max + self.editor.action(Action::End); + } + }, // Remove character at cursor 'x' => self.editor.action(Action::Delete), // Remove character before cursor