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)
This commit is contained in:
parent
66012fb413
commit
2cd40f7aa7
1 changed files with 34 additions and 32 deletions
|
@ -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")))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue