ZIm/crates/vim/src/helix/select.rs
2025-07-21 15:52:35 +02:00

77 lines
2.5 KiB
Rust

use text::SelectionGoal;
use ui::{Context, Window};
use crate::{Vim, object::Object};
impl Vim {
/// Selects the object each cursor is over.
/// Follows helix convention.
pub fn select_current_object(
&mut self,
object: Object,
around: bool,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.stop_recording(cx);
self.update_editor(window, cx, |_, editor, window, cx| {
editor.change_selections(Default::default(), window, cx, |s| {
s.move_with(|map, selection| {
let Some(range) = object.helix_range(map, selection.clone(), around) else {
return;
};
selection.set_tail_head(range.start, range.end, SelectionGoal::None);
});
});
});
}
/// Selects the next object from each cursor which the cursor is not over.
/// Follows helix convention.
pub fn select_next_object(
&mut self,
object: Object,
around: bool,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.stop_recording(cx);
self.update_editor(window, cx, |_, editor, window, cx| {
editor.change_selections(Default::default(), window, cx, |s| {
s.move_with(|map, selection| {
let Some(range) = object.helix_next_range(map, selection.clone(), around)
else {
return;
};
selection.set_tail_head(range.start, range.end, SelectionGoal::None);
});
});
});
}
/// Selects the previous object from each cursor which the cursor is not over.
/// Follows helix convention.
pub fn select_previous_object(
&mut self,
object: Object,
around: bool,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.stop_recording(cx);
self.update_editor(window, cx, |_, editor, window, cx| {
editor.change_selections(Default::default(), window, cx, |s| {
s.move_with(|map, selection| {
let Some(range) = object.helix_previous_range(map, selection.clone(), around)
else {
return;
};
selection.set_tail_head(range.start, range.end, SelectionGoal::None);
});
});
});
}
}