From f04d5bb140a616598c1a310ae9c954260a37cd5e Mon Sep 17 00:00:00 2001 From: Harishankar G Date: Thu, 4 Apr 2024 07:19:40 +0530 Subject: [PATCH] Use an enum to represent yank decision during deletion of a selection --- helix-term/src/commands.rs | 40 ++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index b3614793ff18..4e5c6a5e5070 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -2617,24 +2617,34 @@ fn selection_is_linewise(selection: &Selection, text: &Rope) -> bool { }) } -fn delete_selection_impl(cx: &mut Context, op: Operation, yank: bool) { +enum YankMode { + Yank, + NoYank, +} + +fn delete_selection_impl(cx: &mut Context, op: Operation, yank: YankMode) { let (view, doc) = current!(cx.editor); let selection = doc.selection(view.id); let only_whole_lines = selection_is_linewise(selection, doc.text()); - if cx.register != Some('_') && yank { - // first yank the selection - let text = doc.text().slice(..); - let values: Vec = selection.fragments(text).map(Cow::into_owned).collect(); - let reg_name = cx.register.unwrap_or('"'); - if let Err(err) = cx.editor.registers.write(reg_name, values) { - cx.editor.set_error(err.to_string()); - return; + match yank { + YankMode::Yank => { + if cx.register != Some('_') { + // yank the selection + let text = doc.text().slice(..); + let values: Vec = selection.fragments(text).map(Cow::into_owned).collect(); + let reg_name = cx.register.unwrap_or('"'); + if let Err(err) = cx.editor.registers.write(reg_name, values) { + cx.editor.set_error(err.to_string()); + return; + } + } } - }; + YankMode::NoYank => {} + } - // then delete + // delete let transaction = Transaction::delete_by_selection(doc.text(), selection, |range| (range.from(), range.to())); doc.apply(&transaction, view.id); @@ -2700,19 +2710,19 @@ fn delete_by_selection_insert_mode( } fn delete_selection(cx: &mut Context) { - delete_selection_impl(cx, Operation::Delete, true); + delete_selection_impl(cx, Operation::Delete, YankMode::Yank); } fn delete_selection_noyank(cx: &mut Context) { - delete_selection_impl(cx, Operation::Delete, false); + delete_selection_impl(cx, Operation::Delete, YankMode::NoYank); } fn change_selection(cx: &mut Context) { - delete_selection_impl(cx, Operation::Change, true); + delete_selection_impl(cx, Operation::Change, YankMode::Yank); } fn change_selection_noyank(cx: &mut Context) { - delete_selection_impl(cx, Operation::Change, false); + delete_selection_impl(cx, Operation::Change, YankMode::NoYank); } fn collapse_selection(cx: &mut Context) {