diff options
author | Gokul Soumya | 2022-02-03 08:11:25 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2022-02-15 05:04:46 +0000 |
commit | 966fbc59849701dc56f70af406444c351bc9f54a (patch) | |
tree | 6047bd525c9690461e16e7bc4090212504c58c24 /helix-term/src | |
parent | 14224495378cb9ac0709869ef0c6478fe7475a4c (diff) |
Add tree-sitter based function, class navigation
Diffstat (limited to 'helix-term/src')
-rw-r--r-- | helix-term/src/commands.rs | 52 | ||||
-rw-r--r-- | helix-term/src/keymap.rs | 6 |
2 files changed, 58 insertions, 0 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 1454a93f..10c18a85 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -398,6 +398,12 @@ impl MappableCommand { surround_delete, "Surround delete", select_textobject_around, "Select around object", select_textobject_inner, "Select inside object", + goto_next_function, "Goto next function", + goto_prev_function, "Goto previous function", + goto_next_class, "Goto next class", + goto_prev_class, "Goto previous class", + goto_next_parameter, "Goto next parameter", + goto_prev_parameter, "Goto previous parameter", dap_launch, "Launch debug target", dap_toggle_breakpoint, "Toggle breakpoint", dap_continue, "Continue program execution", @@ -5907,6 +5913,52 @@ fn scroll_down(cx: &mut Context) { scroll(cx, cx.count(), Direction::Forward); } +fn goto_ts_object_impl(cx: &mut Context, object: &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 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, + }; + + doc.set_selection(view.id, Selection::single(new_range.anchor, new_range.head)); +} + +fn goto_next_function(cx: &mut Context) { + goto_ts_object_impl(cx, "function", Direction::Forward) +} + +fn goto_prev_function(cx: &mut Context) { + goto_ts_object_impl(cx, "function", Direction::Backward) +} + +fn goto_next_class(cx: &mut Context) { + goto_ts_object_impl(cx, "class", Direction::Forward) +} + +fn goto_prev_class(cx: &mut Context) { + goto_ts_object_impl(cx, "class", Direction::Backward) +} + +fn goto_next_parameter(cx: &mut Context) { + goto_ts_object_impl(cx, "parameter", Direction::Forward) +} + +fn goto_prev_parameter(cx: &mut Context) { + goto_ts_object_impl(cx, "parameter", Direction::Backward) +} + fn select_textobject_around(cx: &mut Context) { select_textobject(cx, textobject::TextObject::Around); } diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index fc90da33..f414f797 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -572,11 +572,17 @@ impl Default for Keymaps { "[" => { "Left bracket" "d" => goto_prev_diag, "D" => goto_first_diag, + "f" => goto_prev_function, + "c" => goto_prev_class, + "p" => goto_prev_parameter, "space" => add_newline_above, }, "]" => { "Right bracket" "d" => goto_next_diag, "D" => goto_last_diag, + "f" => goto_next_function, + "c" => goto_next_class, + "p" => goto_next_parameter, "space" => add_newline_below, }, |