Skip to content

Commit

Permalink
vim: Handle visual selection when jumping to mark (#25360)
Browse files Browse the repository at this point in the history
Fix how vim mode handles jumping to mark, when one of vim's visual modes
is active, in order to behave just like neovim. Here's a quick video
showing the updated behavior ↓


https://github.com/user-attachments/assets/db91f574-d7e8-429d-952e-3435c43e31bd

Closes #18131 

Release Notes:

- Fixed vim's visual selections when jumping to marks
  • Loading branch information
dinocosta authored Feb 22, 2025
1 parent ef53f7a commit 5d751cd
Showing 1 changed file with 20 additions and 4 deletions.
24 changes: 20 additions & 4 deletions crates/vim/src/normal/mark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ impl Vim {
_ => self.marks.get(&*text).cloned(),
};

let Some(anchors) = anchors else { return };
let Some(mut anchors) = anchors else { return };

let is_active_operator = self.active_operator().is_some();
if is_active_operator {
Expand All @@ -120,6 +120,12 @@ impl Vim {
)
}
} else {
// Save the last anchor so as to jump to it later.
let anchor: Option<Anchor> = anchors.last_mut().map(|anchor| *anchor);
let should_jump = self.mode == Mode::Visual
|| self.mode == Mode::VisualLine
|| self.mode == Mode::VisualBlock;

self.update_editor(window, cx, |_, editor, window, cx| {
let map = editor.snapshot(window, cx);
let mut ranges: Vec<Range<Anchor>> = Vec::new();
Expand All @@ -132,14 +138,24 @@ impl Vim {
.buffer_snapshot
.anchor_before(point.to_point(&map.display_snapshot));
}

if ranges.last() != Some(&(anchor..anchor)) {
ranges.push(anchor..anchor);
}
}
editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| {
s.select_anchor_ranges(ranges)
})

if !should_jump {
editor.change_selections(Some(Autoscroll::fit()), window, cx, |s| {
s.select_anchor_ranges(ranges)
});
}
});

if should_jump {
if let Some(anchor) = anchor {
self.motion(Motion::Jump { anchor, line }, window, cx)
}
}
}
}
}
Expand Down

0 comments on commit 5d751cd

Please sign in to comment.