From f0e1e6e2b55458440dcbe3b844630edecd8c8017 Mon Sep 17 00:00:00 2001 From: pagedmov Date: Fri, 20 Feb 2026 12:18:34 -0500 Subject: [PATCH] visual mode deletions now properly yank deleted text into the selected register --- src/prompt/readline/linebuf.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 7c5abf4..2a8b0f2 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -15,7 +15,7 @@ use crate::{ error::ShResult, term::{Style, Styled}, }, - prelude::*, + prelude::*, prompt::readline::register::write_register, }; const PUNCTUATION: [&str; 3] = ["?", "!", "."]; @@ -562,9 +562,9 @@ impl LineBuf { self.buffer.remove(idx); self.update_graphemes(); } - pub fn drain(&mut self, start: usize, end: usize) -> String { - let start = start.max(0); - let end = end.min(self.grapheme_indices().len()); + pub fn drain(&mut self, range: Range) -> String { + let start = range.start.max(0); + let end = range.end.min(self.grapheme_indices().len()); let drained = if end == self.grapheme_indices().len() { if start == self.grapheme_indices().len() { return String::new(); @@ -579,6 +579,9 @@ impl LineBuf { self.update_graphemes(); drained } + pub fn drain_inclusive(&mut self, range: RangeInclusive) -> String { + self.drain(*range.start()..range.end().saturating_add(1)) + } pub fn push(&mut self, ch: char) { self.buffer.push(ch); self.update_graphemes(); @@ -2389,7 +2392,7 @@ impl LineBuf { .map(|c| c.to_string()) .unwrap_or_default() } else { - let drained = self.drain(start, end); + let drained = self.drain(start..end); self.update_graphemes(); drained }; @@ -2572,6 +2575,16 @@ impl LineBuf { let Some(content) = register.read_from_register() else { return Ok(()); }; + if let Some(range) = self.select_range { + let register_text = self.drain_inclusive(range.0..=range.1); + write_register(None, register_text); // swap deleted text into register + + self.insert_str_at(range.0, &content); + self.cursor.set(range.0 + content.chars().count()); + self.select_range = None; + self.update_graphemes(); + return Ok(()); + } let insert_idx = match anchor { Anchor::After => self.cursor.ret_add(1), Anchor::Before => self.cursor.get(),