From 2cd40f7aa71a22fa9a32642c1ace33f0d7bcecef Mon Sep 17 00:00:00 2001 From: Jeetaditya Chatterjee Date: Sun, 19 Dec 2021 22:22:32 +0000 Subject: [PATCH] fix(tree-sitter): properly gatekeep ts text objs before today all text objects were bound in all modes, now they have been properly gatekept and only appear when `+tree-sitter-keys-mode` is enabled / hooked, this allows for more flexibility and the ability to arbitrarily disable / enable tree sitter text objects (which is nice) --- modules/tools/tree-sitter/config.el | 66 +++++++++++++++-------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/modules/tools/tree-sitter/config.el b/modules/tools/tree-sitter/config.el index f8362d511..e85da3c24 100644 --- a/modules/tools/tree-sitter/config.el +++ b/modules/tools/tree-sitter/config.el @@ -4,45 +4,47 @@ :defer t ;; loading is handled by individual modes :hook (tree-sitter-after-on . tree-sitter-hl-mode) :config - (defvar +tree-sitter-enabled-mode-maps (seq-map (lambda (mode) - (intern (concat - (symbol-name (car mode)) "-map"))) - tree-sitter-major-mode-language-alist) - "List of mode hooks for tree sitter enabled modes.") ;; This makes every node a link to a section of code (setq tree-sitter-debug-jump-buttons t ;; and this highlights the entire sub tree in your code tree-sitter-debug-highlight-jump-region t)) -(if (daemonp) ;; HACK: eager load when in daemon as its start time is easily consumed - (require 'tree-sitter-langs) - (add-hook! 'tree-sitter-after-on-hook - (require 'tree-sitter-langs))) +(defvar +tree-sitter-inner-text-objects-map (make-sparse-keymap)) +(defvar +tree-sitter-outer-text-objects-map (make-sparse-keymap)) +(defvar +tree-sitter-keys-mode-map + (let ((keymap (make-sparse-keymap))) + (evil-define-key '(visual operator) '+tree-sitter-keys-mode + "i" +tree-sitter-inner-text-objects-map + "a" +tree-sitter-outer-text-objects-map) + keymap) + "Basic keymap for tree sitter text objects") -(when (featurep! :editor evil +everywhere) - (use-package! evil-textobj-tree-sitter - :after tree-sitter - :config - (map! - :map +tree-sitter-enabled-mode-maps - :textobj "f" nil nil - :textobj "f" (evil-textobj-tree-sitter-get-textobj "function.inner") (evil-textobj-tree-sitter-get-textobj "function.outer") +(define-minor-mode +tree-sitter-keys-mode + "A minor mode with tree sitter keybinds." + :keymap +tree-sitter-keys-mode-map) - :textobj "F" (evil-textobj-tree-sitter-get-textobj "call.inner") (evil-textobj-tree-sitter-get-textobj "call.outer") +(use-package! evil-textobj-tree-sitter + :when (featurep! :editor evil +everywhere) + :after tree-sitter + :config - :textobj "C" (evil-textobj-tree-sitter-get-textobj "class.inner") (evil-textobj-tree-sitter-get-textobj "class.outer") + (map! (:map +tree-sitter-inner-text-objects-map + "f" (evil-textobj-tree-sitter-get-textobj "function.inner") + "F" (evil-textobj-tree-sitter-get-textobj "call.inner") + "C" (evil-textobj-tree-sitter-get-textobj "class.inner") + "i" (evil-textobj-tree-sitter-get-textobj "conditional.inner") + "l" (evil-textobj-tree-sitter-get-textobj "loop.inner")) + (:map +tree-sitter-outer-text-objects-map + "f" (evil-textobj-tree-sitter-get-textobj "function.outer") + "F" (evil-textobj-tree-sitter-get-textobj "call.outer") + "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"))) - :textobj "c" nil nil - :textobj "c" nil (evil-textobj-tree-sitter-get-textobj "comment.outer") - - :textobj "i" nil nil - :textobj "i" (evil-textobj-tree-sitter-get-textobj "conditional.inner") (evil-textobj-tree-sitter-get-textobj "conditional.outer") - - :textobj "l" nil nil - :textobj "l" (evil-textobj-tree-sitter-get-textobj "loop.inner") (evil-textobj-tree-sitter-get-textobj "loop.outer")) - (after! which-key - (setq which-key-allow-multiple-replacements t) - (pushnew! - which-key-replacement-alist - '(("" . "\\`+?evil-textobj-tree-sitter-function--\\(.*\\)\\(?:.inner\\|.outer\\)") . (nil . "\\1")))))) + (after! which-key + (setq which-key-allow-multiple-replacements t) + (pushnew! + which-key-replacement-alist + '(("" . "\\`+?evil-textobj-tree-sitter-function--\\(.*\\)\\(?:.inner\\|.outer\\)") . (nil . "\\1")))))