aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorGokul Soumya2022-02-03 08:11:25 +0000
committerBlaž Hrastnik2022-02-15 05:04:46 +0000
commit966fbc59849701dc56f70af406444c351bc9f54a (patch)
tree6047bd525c9690461e16e7bc4090212504c58c24 /helix-term
parent14224495378cb9ac0709869ef0c6478fe7475a4c (diff)
Add tree-sitter based function, class navigation
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs52
-rw-r--r--helix-term/src/keymap.rs6
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,
},