1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-11 09:20:51 +00:00

Add treesit-defun-at-point and fix c-ts-mode-indent-defun

* lisp/treesit.el (treesit-defun-at-point): New function.
* lisp/progmodes/c-ts-mode.el (c-ts-mode-indent-defun): Implement with
treesit-defun-at-point.
This commit is contained in:
Yuan Fu 2022-12-20 21:22:30 -08:00
parent 69123d4aa4
commit 7dea58b88d
No known key found for this signature in database
GPG Key ID: 56E19BC57664A442
2 changed files with 27 additions and 7 deletions

View File

@ -556,13 +556,10 @@ the semicolon. This function skips the semicolon."
`treesit-defun-type-regexp' defines what constructs to indent."
(interactive "*")
(let ((orig-point (point-marker)))
;; If `treesit-beginning-of-defun' returns nil, we are not in a
;; defun, so don't indent anything.
(when (treesit-beginning-of-defun)
(let ((start (point)))
(treesit-end-of-defun)
(indent-region start (point))))
(when-let ((orig-point (point-marker))
(node (treesit-defun-at-point)))
(indent-region (treesit-node-start node)
(treesit-node-end node))
(goto-char orig-point)))
(defvar-keymap c-ts-mode-map

View File

@ -1834,6 +1834,29 @@ function is called recursively."
;; Counter equal to 0 means we successfully stepped ARG steps.
(if (eq counter 0) pos nil)))
;; TODO: In corporate into thing-at-point.
(defun treesit-defun-at-point ()
"Return the defun at point or nil if none is found.
Respects `treesit-defun-tactic': return the top-level defun if it
is `top-level', return the immediate parent defun if it is
`nested'."
(pcase-let* ((`(,regexp . ,pred)
(if (consp treesit-defun-type-regexp)
treesit-defun-type-regexp
(cons treesit-defun-type-regexp nil)))
(`(,_ ,next ,parent)
(treesit--defuns-around (point) regexp pred))
;; If point is at the beginning of a defun, we
;; prioritize that defun over the parent in nested
;; mode.
(node (or (and (eq (treesit-node-start next) (point))
next)
parent)))
(if (eq treesit-defun-tactic 'top-level)
(treesit--top-level-defun node regexp pred)
node)))
;;; Activating tree-sitter
(defun treesit-ready-p (language &optional quiet)