Correct other end visual block functionality (#27678)
Closes #27385 Builds on #27604 so that `vim::OtherEnd` works in visual block mode. This is accomplished by reversing the order of active selections in the buffer when the user hit `o`, so that the cursor moves diagonally across the selection. The current behavior is preserved for `shift-o`, which is how the cursors behave in vim. We'll close #27604 since this encapsulates that change, but if you'd prefer to take only the visual block motion component, we'll keep the branch for #27604 open. Test case: growing a box down and to the right, other ending, followed by growing and shrinking the box: https://github.com/user-attachments/assets/1df544e1-efce-4354-b354-bbfec007a7df Test case: growing a box up and to the left, other ending, followed by growing and shrinking the box: https://github.com/user-attachments/assets/2f6d7729-c63a-4486-960b-23474c2e507a Release Notes: - Improved visual block mode when cursor is at beginning of selection - Improved visual block mode so that `o` and `shift-o` reach parity with vim --------- Co-authored-by: KyleBarton <kjbarton4@gmail.com>
This commit is contained in:
parent
4a5c492188
commit
5c0adde7bb
8 changed files with 165 additions and 6 deletions
|
@ -655,6 +655,25 @@ impl<'a> MutableSelectionsCollection<'a> {
|
|||
.collect();
|
||||
self.select(selections);
|
||||
}
|
||||
pub fn reverse_selections(&mut self) {
|
||||
let map = &self.display_map();
|
||||
let mut new_selections: Vec<Selection<Point>> = Vec::new();
|
||||
let disjoint = self.disjoint.clone();
|
||||
for selection in disjoint
|
||||
.iter()
|
||||
.sorted_by(|first, second| Ord::cmp(&second.id, &first.id))
|
||||
.collect::<Vec<&Selection<Anchor>>>()
|
||||
{
|
||||
new_selections.push(Selection {
|
||||
id: self.new_selection_id(),
|
||||
start: selection.start.to_display_point(map).to_point(map),
|
||||
end: selection.end.to_display_point(map).to_point(map),
|
||||
reversed: selection.reversed,
|
||||
goal: selection.goal,
|
||||
});
|
||||
}
|
||||
self.select(new_selections);
|
||||
}
|
||||
|
||||
pub fn move_with(
|
||||
&mut self,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue