From ed79dfccfb0c0fae9dc87a945f521b6463ce07b6 Mon Sep 17 00:00:00 2001 From: xenia Date: Mon, 13 Nov 2023 19:10:22 +0100 Subject: [PATCH] Rewire SelectNextNode / SelectPreviousNode --- src/main.rs | 61 ++++++++++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6e54d63..087e43a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -125,56 +125,45 @@ fn handle_request(config: &Config, request: &Request) -> String { } kakoune::select_ranges(&buffer, &new_ranges) } - Op::SelectNextNode { kind } => { + Op::SelectNextNode { kind } | Op::SelectPreviousNode { kind } => { let kinds = kind .as_ref() .and_then(|kind| Some(filetype_config.resolve_alias(kind))); 'outer_next: for range in &ranges { let node = tree::shrink_to_range(tree.root_node(), range); - let mut cursor = traverse_up_to_node_which_matters(filetype_config, node); + let mut cursor = node; loop { - while let Some(node) = cursor.next_named_sibling() { - if filetype_config.is_node_visible(node) && node_of_kinds(node, &kinds) { - new_ranges.push(node.range()); - continue 'outer_next; + let parent = cursor.parent(); + loop { + if filetype_config.is_node_visible(cursor) && node_of_kinds(cursor, &kinds) { + if cursor != node { + new_ranges.push(cursor.range()); + continue 'outer_next; + } + } + if let Op::SelectNextNode { .. } = request.op { + if let Some(next) = cursor.next_named_sibling() { + cursor = next; + } else { + break; + } + } else { + if let Some(prev) = cursor.prev_named_sibling() { + cursor = prev; + } else { + break; + } } - cursor = node; } - if let Some(parent) = cursor.parent() { + if let Some(parent) = parent { cursor = parent; } else { break; } } // TODO: Do we want this behaviour? - let node = find_parent_of_interest(filetype_config, node, &kinds); - new_ranges.push(node.range()); - } - kakoune::select_ranges(&buffer, &new_ranges) - } - Op::SelectPreviousNode { kind } => { - let kinds = kind - .as_ref() - .and_then(|kind| Some(filetype_config.resolve_alias(kind))); - 'outer_prev: for range in &ranges { - let node = tree::shrink_to_range(tree.root_node(), range); - let mut cursor = traverse_up_to_node_which_matters(filetype_config, node); - loop { - while let Some(node) = cursor.prev_named_sibling() { - if filetype_config.is_node_visible(node) && node_of_kinds(node, &kinds) { - new_ranges.push(node.range()); - continue 'outer_prev; - } - cursor = node; - } - if let Some(parent) = cursor.parent() { - cursor = parent; - } else { - break; - } - } - let node = find_parent_of_interest(filetype_config, node, &kinds); - new_ranges.push(node.range()); + // let node = find_parent_of_interest(filetype_config, node, &kinds); + // new_ranges.push(node.range()); } kakoune::select_ranges(&buffer, &new_ranges) }