diff --git a/crates/vim/src/surrounds.rs b/crates/vim/src/surrounds.rs index bc817e2d4871a0be07e8c100b332f5630dcec711..579ab7842096f1e5cb1bb4c70e2fd8f4256355d0 100644 --- a/crates/vim/src/surrounds.rs +++ b/crates/vim/src/surrounds.rs @@ -282,6 +282,7 @@ impl Vim { // that the end replacement string does not exceed // this value. Helpful when dealing with newlines. let mut edit_len = 0; + let mut open_range_end = 0; let mut chars_and_offset = display_map .buffer_chars_at(range.start.to_offset(&display_map, Bias::Left)) .peekable(); @@ -290,11 +291,11 @@ impl Vim { if ch.to_string() == will_replace_pair.start { let mut open_str = pair.start.clone(); let start = offset; - let mut end = start + 1; + open_range_end = start + 1; while let Some((next_ch, _)) = chars_and_offset.next() - && next_ch.to_string() == " " + && next_ch == ' ' { - end += 1; + open_range_end += 1; if preserve_space { open_str.push(next_ch); @@ -305,8 +306,8 @@ impl Vim { open_str.push(' '); }; - edit_len = end - start; - edits.push((start..end, open_str)); + edit_len = open_range_end - start; + edits.push((start..open_range_end, open_str)); anchors.push(start..start); break; } @@ -323,8 +324,9 @@ impl Vim { let mut start = offset; let end = start + 1; while let Some((next_ch, _)) = reverse_chars_and_offsets.next() - && next_ch.to_string() == " " + && next_ch == ' ' && close_str.len() < edit_len - 1 + && start > open_range_end { start -= 1; @@ -1236,6 +1238,23 @@ mod test { Mode::Normal, ); + // test spaces with quote change surrounds + cx.set_state( + indoc! {" + fn test_surround() { + \"ˇ \" + };"}, + Mode::Normal, + ); + cx.simulate_keystrokes("c s \" '"); + cx.assert_state( + indoc! {" + fn test_surround() { + ˇ' ' + };"}, + Mode::Normal, + ); + // Currently, the same test case but using the closing bracket `]` // actually removes a whitespace before the closing bracket, something // that might need to be fixed?