From ac429cbdf40c6032d91830db70d9ce65c01fbbe6 Mon Sep 17 00:00:00 2001 From: pagedmov Date: Sun, 8 Mar 2026 00:36:46 -0500 Subject: [PATCH] Fix crash when using vi visual selection on empty buffer --- src/readline/linebuf.rs | 5 ++++- src/readline/tests.rs | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/readline/linebuf.rs b/src/readline/linebuf.rs index 153924c..d4660de 100644 --- a/src/readline/linebuf.rs +++ b/src/readline/linebuf.rs @@ -3489,6 +3489,9 @@ impl LineBuf { impl Display for LineBuf { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let mut full_buf = self.buffer.clone(); + if full_buf.is_empty() { + return write!(f, "{}", full_buf); + } if let Some((start, end)) = self.select_range() { let mode = self.select_mode.unwrap(); let start_byte = self.read_idx_byte_pos(start); @@ -3497,7 +3500,7 @@ impl Display for LineBuf { match mode.anchor() { SelectAnchor::Start => { let mut inclusive = start_byte..=end_byte; - if *inclusive.end() == full_buf.len() { + if *inclusive.end() >= full_buf.len() { inclusive = start_byte..=end_byte.saturating_sub(1); } let selected = format!( diff --git a/src/readline/tests.rs b/src/readline/tests.rs index fa19d02..c0ccdd3 100644 --- a/src/readline/tests.rs +++ b/src/readline/tests.rs @@ -225,5 +225,6 @@ vi_test! { vi_dollar_single : "h" => "$" => "h", 0; vi_caret_no_ws : "hello" => "$^" => "hello", 0; vi_f_last_char : "hello" => "fo" => "hello", 4; - vi_r_on_space : "hello world" => "5|r-" => "hell- world", 4 + vi_r_on_space : "hello world" => "5|r-" => "hell- world", 4; + vi_vw_doesnt_crash : "" => "vw" => "", 0 }