diff --git a/local/recipes/tui/tlc/source/src/editor/menubar.rs b/local/recipes/tui/tlc/source/src/editor/menubar.rs index db491f10b9..ebfe52884c 100644 --- a/local/recipes/tui/tlc/source/src/editor/menubar.rs +++ b/local/recipes/tui/tlc/source/src/editor/menubar.rs @@ -91,6 +91,8 @@ pub enum EditorCmd { Close, /// Toggle insert/overwrite mode (INS key, MC CK_InsertOverwrite). ToggleOverwrite, + /// Delete character/selection (MC CK_Remove). + Delete, } /// Outcome of a menu-bar key press. @@ -215,6 +217,7 @@ impl EditorMenuBar { MenuItem::item("Cut", 'x', EditorCmd::Cut), MenuItem::item("Copy", 'c', EditorCmd::Copy), MenuItem::item("Paste", 'v', EditorCmd::Paste), + MenuItem::item("Delete", 'd', EditorCmd::Delete), MenuItem::separator(), MenuItem::item("Select all", 'a', EditorCmd::MarkAll), ], diff --git a/local/recipes/tui/tlc/source/src/editor/mod.rs b/local/recipes/tui/tlc/source/src/editor/mod.rs index 84d22015d2..83baeff090 100644 --- a/local/recipes/tui/tlc/source/src/editor/mod.rs +++ b/local/recipes/tui/tlc/source/src/editor/mod.rs @@ -1310,6 +1310,23 @@ impl Editor { self.message = Some("Block copied".to_string()); } } + EditorCmd::Delete => { + if self.cursor.has_selection() { + self.cursor.delete_selection(&mut self.buffer); + self.cursor.set_position(self.buffer.cursor(), &self.buffer); + self.modified = self.buffer.is_modified(); + self.message = Some("Deleted".to_string()); + } else { + // Delete forward one character. + self.cursor.set_position(self.buffer.cursor(), &self.buffer); + let _ = self.cursor.select_right(&mut self.buffer); + if self.cursor.has_selection() { + self.cursor.delete_selection(&mut self.buffer); + self.cursor.set_position(self.buffer.cursor(), &self.buffer); + self.modified = self.buffer.is_modified(); + } + } + } EditorCmd::Paste => { if let Some(text) = self.clipboard.clone() { if self.cursor.has_selection() { @@ -3922,6 +3939,17 @@ mod tests { assert!(e.mode.is_prompt()); } + #[test] + fn delete_forward_without_selection_removes_one_char() { + let mut e = make_empty(); + e.insert_str("ab"); + e.buffer.set_cursor(0); + e.cursor.set_position(0, &e.buffer); + let _ = e.dispatch_editor_cmd(crate::editor::menubar::EditorCmd::Delete); + assert_eq!(e.buffer.len(), 1); + assert_eq!(e.buffer.as_string(), "b"); + } + #[test] fn toggle_overwrite_cycles_ovr_ins() { let mut e = make_empty();