From 87b85ca083f4565c59275843de28ed74d64cdb36 Mon Sep 17 00:00:00 2001 From: vasilito Date: Tue, 7 Jul 2026 16:01:01 +0300 Subject: [PATCH] W66: Editor Delete command in Edit menu (MC CK_Remove) Add Delete EditorCmd variant and wire it into the F9 Edit menu between Paste and Select All. With a selection, deletes the selected text. Without a selection, deletes one character forward (select_right + delete_selection). Added 1 unit test verifying single-character forward delete. Tests: 1425 pass (was 1424), zero warnings. --- .../tui/tlc/source/src/editor/menubar.rs | 3 ++ .../recipes/tui/tlc/source/src/editor/mod.rs | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) 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();