Skip to content

Commit

Permalink
Refactor goto_ts_object_impl as a motion (helix-editor#3264)
Browse files Browse the repository at this point in the history
This refactor changes the overall structure of the goto_ts_object_impl
command without removing any functionality from its behavior. The
refactored motion:

* acts on all selections instead of reducing to one selection
* may be repeated with the `repeat_last_motion` (A-.) command
* informs the user when the syntax-tree is not accessible in the current buffer
  • Loading branch information
the-mikedavis authored and Shekhinah Memmel committed Dec 11, 2022
1 parent 2e50f16 commit 2166c1c
Showing 1 changed file with 24 additions and 17 deletions.
41 changes: 24 additions & 17 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4291,26 +4291,33 @@ fn scroll_down(cx: &mut Context) {
scroll(cx, cx.count(), Direction::Forward);
}

fn goto_ts_object_impl(cx: &mut Context, object: &str, direction: Direction) {
fn goto_ts_object_impl(cx: &mut Context, object: &'static str, direction: Direction) {
let count = cx.count();
let (view, doc) = current!(cx.editor);
let text = doc.text().slice(..);
let range = doc.selection(view.id).primary();
let motion = move |editor: &mut Editor| {
let (view, doc) = current!(editor);
if let Some((lang_config, syntax)) = doc.language_config().zip(doc.syntax()) {
let text = doc.text().slice(..);
let root = syntax.tree().root_node();

let new_range = match doc.language_config().zip(doc.syntax()) {
Some((lang_config, syntax)) => movement::goto_treesitter_object(
text,
range,
object,
direction,
syntax.tree().root_node(),
lang_config,
count,
),
None => range,
};
let selection = doc.selection(view.id).clone().transform(|range| {
movement::goto_treesitter_object(
text,
range,
object,
direction,
root,
lang_config,
count,
)
});

doc.set_selection(view.id, Selection::single(new_range.anchor, new_range.head));
doc.set_selection(view.id, selection);
} else {
editor.set_status("Syntax-tree is not available in current buffer");
}
};
motion(cx.editor);
cx.editor.last_motion = Some(Motion(Box::new(motion)));
}

fn goto_next_function(cx: &mut Context) {
Expand Down

0 comments on commit 2166c1c

Please sign in to comment.