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.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.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.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); }); }); }); } }