Fix vim surround behavior around text objects (#17603)

Performing `ysa")` on `"Hello World"` should produce `("Hello World")`.
Instead it places the parens inside the quotes (i.e. `"(Hello World)"`).
This PR fixes the behavior by preserving the `around` flag from the
operator sequence.

Closes #12976 and partially fixes #13841

Release Notes:

- Fixed the behavior of surrounding a text object in vim.
This commit is contained in:
Eric Andres 2024-09-10 09:49:04 -06:00 committed by GitHub
parent d5498c52f8
commit 5f61e3140f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 38 additions and 4 deletions

View file

@ -248,7 +248,7 @@ impl Vim {
}
Some(Operator::AddSurrounds { target: None }) => {
waiting_operator = Some(Operator::AddSurrounds {
target: Some(SurroundsType::Object(object)),
target: Some(SurroundsType::Object(object, around)),
});
}
Some(Operator::ToggleComments) => self.toggle_comments_object(object, around, cx),

View file

@ -13,7 +13,7 @@ use ui::ViewContext;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SurroundsType {
Motion(Motion),
Object(Object),
Object(Object, bool),
Selection,
}
@ -59,8 +59,8 @@ impl Vim {
for selection in &display_selections {
let range = match &target {
SurroundsType::Object(object) => {
object.range(&display_map, selection.clone(), false)
SurroundsType::Object(object, around) => {
object.range(&display_map, selection.clone(), *around)
}
SurroundsType::Motion(motion) => {
motion
@ -697,6 +697,40 @@ mod test {
the lazy dog."},
Mode::Normal,
);
// test add surrounds around object
cx.set_state(
indoc! {"
The [quˇick] brown
fox jumps over
the lazy dog."},
Mode::Normal,
);
cx.simulate_keystrokes("y s a ] )");
cx.assert_state(
indoc! {"
The ˇ([quick]) brown
fox jumps over
the lazy dog."},
Mode::Normal,
);
// test add surrounds inside object
cx.set_state(
indoc! {"
The [quˇick] brown
fox jumps over
the lazy dog."},
Mode::Normal,
);
cx.simulate_keystrokes("y s i ] )");
cx.assert_state(
indoc! {"
The [ˇ(quick)] brown
fox jumps over
the lazy dog."},
Mode::Normal,
);
}
#[gpui::test]