about summary refs log tree commit diff
path: root/users/Profpatsch/emacs-tree-sitter-move
diff options
context:
space:
mode:
Diffstat (limited to 'users/Profpatsch/emacs-tree-sitter-move')
-rw-r--r--users/Profpatsch/emacs-tree-sitter-move/tmp.el6
-rw-r--r--users/Profpatsch/emacs-tree-sitter-move/tree-sitter-move.el22
2 files changed, 22 insertions, 6 deletions
diff --git a/users/Profpatsch/emacs-tree-sitter-move/tmp.el b/users/Profpatsch/emacs-tree-sitter-move/tmp.el
index fa13da1207..f7a8437096 100644
--- a/users/Profpatsch/emacs-tree-sitter-move/tmp.el
+++ b/users/Profpatsch/emacs-tree-sitter-move/tmp.el
@@ -9,6 +9,6 @@
 
 (define-key evil-normal-state-map (kbd "C-.") #'tree-sitter-move-reset)
 (define-key evil-normal-state-map (kbd "C-<right>") #'tree-sitter-move-right)
-;; (define-key evil-normal-state-map (kbd "C-<left>") 'sp-backward-parallel-sexp)
-;; (define-key evil-normal-state-map (kbd "C-<down>") 'sp-down-sexp)
-;; (define-key evil-normal-state-map (kbd "C-<up>") 'sp-backward-up-sexp)
+(define-key evil-normal-state-map (kbd "C-<left>") #'tree-sitter-move-left)
+(define-key evil-normal-state-map (kbd "C-<up>") 'tree-sitter-move-up)
+(define-key evil-normal-state-map (kbd "C-<down>") 'tree-sitter-move-down)
diff --git a/users/Profpatsch/emacs-tree-sitter-move/tree-sitter-move.el b/users/Profpatsch/emacs-tree-sitter-move/tree-sitter-move.el
index 0a5e34e4be..0fd16e6752 100644
--- a/users/Profpatsch/emacs-tree-sitter-move/tree-sitter-move.el
+++ b/users/Profpatsch/emacs-tree-sitter-move/tree-sitter-move.el
@@ -83,14 +83,30 @@
   (tree-sitter-move--set-cursor-to-node-at-point))
 
 (defun tree-sitter-move-right ()
-  "Moves to the next sibling. If the current node does not have siblings, go
-  upwards until something has siblings and then move right."
   (interactive)
+  (tree-sitter-move--move-skip-non-sibling-nodes 'tsc-get-next-named-sibling))
+
+(defun tree-sitter-move-left ()
+  (interactive)
+  (tree-sitter-move--move-skip-non-sibling-nodes 'tsc-get-prev-named-sibling))
+
+(defun tree-sitter-move-up ()
+  (interactive)
+  (tree-sitter-move--move-skip-non-sibling-nodes 'tsc-get-parent))
+
+;; TODO doesn’t work yet because sibling nodes are only skipped upwards
+;; (defun tree-sitter-move-down ()
+;;   (interactive)
+;;   (tree-sitter-move--move-skip-non-sibling-nodes (lambda (n) (tsc-get-nth-named-child n 0))))
+
+(defun tree-sitter-move--move-skip-non-sibling-nodes (move-fn)
+  "Moves to the sidewards next sibling. If the current node does not have siblings, go
+  upwards until something has siblings and then move to the side (right or left)."
   (tree-sitter-move--move-if-possible
    (lambda (cur)
      (when-let ((with-siblings
                  (tsc-get-first-named-node-with-siblings-up cur)))
-       (tsc-get-next-named-sibling with-siblings)))))
+       (funcall move-fn with-siblings)))))
 
 (defun tree-sitter-move--move-if-possible (dir-fn)
   (let ((next (funcall dir-fn tree-sitter-move--cursor)))