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:
parent
69123d4aa4
commit
7dea58b88d
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user