From: Yuan Fu Date: Wed, 21 Dec 2022 05:22:30 +0000 (-0800) Subject: Add treesit-defun-at-point and fix c-ts-mode-indent-defun X-Git-Tag: emacs-29.0.90~1047^2~1 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7dea58b88db3e272e01e537a3a5d2158ef7f9608;p=emacs.git 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. --- diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 8ed1a77637a..ea9891f3345 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -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 diff --git a/lisp/treesit.el b/lisp/treesit.el index e4f3698dcd9..a7882dda2cc 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -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)