From 89f82428e6df6f0da6649db04d09b43ca23409c0 Mon Sep 17 00:00:00 2001 From: Jeetaditya Chatterjee Date: Mon, 24 Jan 2022 18:32:38 +0000 Subject: [PATCH] feat(tree-sitter): goto functionality --- modules/tools/tree-sitter/autoload.el | 10 ++++++++++ modules/tools/tree-sitter/config.el | 27 ++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 modules/tools/tree-sitter/autoload.el diff --git a/modules/tools/tree-sitter/autoload.el b/modules/tools/tree-sitter/autoload.el new file mode 100644 index 000000000..3c7c67d14 --- /dev/null +++ b/modules/tools/tree-sitter/autoload.el @@ -0,0 +1,10 @@ +;;; tools/tree-sitter/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +tree-sitter-goto-textobj (group &optional previous end query) + "Thin wrapper that returns the symbol of a named function, used in keybindings." + (let ((sym (intern (format "+goto%s%s-%s" (if previous "-previous" "") (if end "-end" "") group)))) + (fset sym (lambda () + (interactive) + (evil-textobj-tree-sitter-goto-textobj group previous end query))) + sym)) diff --git a/modules/tools/tree-sitter/config.el b/modules/tools/tree-sitter/config.el index d25a75b4f..8d9df2fbb 100644 --- a/modules/tools/tree-sitter/config.el +++ b/modules/tools/tree-sitter/config.el @@ -11,12 +11,19 @@ (defvar +tree-sitter-inner-text-objects-map (make-sparse-keymap)) (defvar +tree-sitter-outer-text-objects-map (make-sparse-keymap)) +(defvar +tree-sitter-goto-previous-map (make-sparse-keymap)) +(defvar +tree-sitter-goto-next-map (make-sparse-keymap)) (defvar +tree-sitter-keys-mode-map (let ((keymap (make-sparse-keymap))) + ;; ts text objects (evil-define-key '(visual operator) '+tree-sitter-keys-mode "i" +tree-sitter-inner-text-objects-map "a" +tree-sitter-outer-text-objects-map) + ;; ts goto nodes + (evil-define-key 'normal '+tree-sitter-keys-mode + "[g" +tree-sitter-goto-previous-map + "]g" +tree-sitter-goto-next-map) keymap) "Basic keymap for tree sitter text objects") @@ -43,7 +50,25 @@ "C" (evil-textobj-tree-sitter-get-textobj "class.outer") "c" (evil-textobj-tree-sitter-get-textobj "comment.outer") "i" (evil-textobj-tree-sitter-get-textobj "conditional.outer") - "l" (evil-textobj-tree-sitter-get-textobj "loop.outer"))) + "l" (evil-textobj-tree-sitter-get-textobj "loop.outer")) + + (:map +tree-sitter-goto-previous-map + "a" (+tree-sitter-goto-textobj "parameter.outer" t) + "f" (+tree-sitter-goto-textobj "function.outer" t) + "F" (+tree-sitter-goto-textobj "call.outer" t) + "C" (+tree-sitter-goto-textobj "class.outer" t) + "c" (+tree-sitter-goto-textobj "comment.outer" t) + "i" (+tree-sitter-goto-textobj "conditional.outer" t) + "l" (+tree-sitter-goto-textobj "loop.outer" t)) + (:map +tree-sitter-goto-next-map + "a" (+tree-sitter-goto-textobj "parameter.outer") + "f" (+tree-sitter-goto-textobj "function.outer") + "F" (+tree-sitter-goto-textobj "call.outer") + "C" (+tree-sitter-goto-textobj "class.outer") + "c" (+tree-sitter-goto-textobj "comment.outer") + "i" (+tree-sitter-goto-textobj "conditional.outer") + "l" (+tree-sitter-goto-textobj "loop.outer"))) + (after! which-key (setq which-key-allow-multiple-replacements t)