diff --git a/src/core_editor/editor.rs b/src/core_editor/editor.rs index 1e908561..ea784c68 100644 --- a/src/core_editor/editor.rs +++ b/src/core_editor/editor.rs @@ -655,6 +655,10 @@ impl Editor { self.delete_selection(); insert_clipboard_content_before(&mut self.line_buffer, self.cut_buffer.deref_mut()); } + + pub(crate) fn reset_selection(&mut self) { + self.selection_anchor = None; + } } fn insert_clipboard_content_before(line_buffer: &mut LineBuffer, clipboard: &mut dyn Clipboard) { diff --git a/src/edit_mode/vi/mod.rs b/src/edit_mode/vi/mod.rs index efb6bcf9..806a19c6 100644 --- a/src/edit_mode/vi/mod.rs +++ b/src/edit_mode/vi/mod.rs @@ -143,12 +143,7 @@ impl EditMode for Vi { self.cache.clear(); self.mode = ViMode::Normal; ReedlineEvent::Multiple(vec![ - // Move left then right to clear the selection. - // Order matters here: this makes sure cursor does not move at end of line - ReedlineEvent::Edit(vec![ - EditCommand::MoveLeft { select: false }, - EditCommand::MoveRight { select: false }, - ]), + ReedlineEvent::ResetSelection, ReedlineEvent::Esc, ReedlineEvent::Repaint, ]) @@ -201,10 +196,7 @@ mod test { assert_eq!( result, ReedlineEvent::Multiple(vec![ - ReedlineEvent::Edit(vec![ - EditCommand::MoveLeft { select: false }, - EditCommand::MoveRight { select: false } - ]), + ReedlineEvent::ResetSelection, ReedlineEvent::Esc, ReedlineEvent::Repaint ]) diff --git a/src/engine.rs b/src/engine.rs index dd9b02f8..c08a27e5 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -909,6 +909,10 @@ impl Reedline { self.input_mode = InputMode::Regular; Ok(EventStatus::Handled) } + ReedlineEvent::ResetSelection => { + self.editor.reset_selection(); + Ok(EventStatus::Handled) + } // TODO: Check if events should be handled ReedlineEvent::Right | ReedlineEvent::Left @@ -1197,6 +1201,10 @@ impl Reedline { Ok(EventStatus::Handled) } ReedlineEvent::OpenEditor => self.open_editor().map(|_| EventStatus::Handled), + ReedlineEvent::ResetSelection => { + self.editor.reset_selection(); + Ok(EventStatus::Handled) + } ReedlineEvent::Resize(width, height) => { self.painter.handle_resize(width, height); Ok(EventStatus::Handled) diff --git a/src/enums.rs b/src/enums.rs index cde42b1a..3e4848e7 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -644,6 +644,9 @@ pub enum ReedlineEvent { /// Open text editor OpenEditor, + + /// Reset the current text selection + ResetSelection, } impl Display for ReedlineEvent { @@ -687,6 +690,7 @@ impl Display for ReedlineEvent { ReedlineEvent::MenuPagePrevious => write!(f, "MenuPagePrevious"), ReedlineEvent::ExecuteHostCommand(_) => write!(f, "ExecuteHostCommand"), ReedlineEvent::OpenEditor => write!(f, "OpenEditor"), + ReedlineEvent::ResetSelection => write!(f, "ResetSelection"), } } }