Refactor goto_ts_object_impl as a motion (#3264)
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
This commit is contained in:
parent
7547a961bb
commit
83f177d270
1 changed files with 24 additions and 17 deletions
|
@ -4251,26 +4251,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);
|
||||
} else {
|
||||
editor.set_status("Syntax-tree is not available in current buffer");
|
||||
}
|
||||
};
|
||||
|
||||
doc.set_selection(view.id, Selection::single(new_range.anchor, new_range.head));
|
||||
motion(cx.editor);
|
||||
cx.editor.last_motion = Some(Motion(Box::new(motion)));
|
||||
}
|
||||
|
||||
fn goto_next_function(cx: &mut Context) {
|
||||
|
|
Loading…
Add table
Reference in a new issue