[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
emacs-29 7dea58b88d 2/3: Add treesit-defun-at-point and fix c-ts-mode-in
From: |
Yuan Fu |
Subject: |
emacs-29 7dea58b88d 2/3: Add treesit-defun-at-point and fix c-ts-mode-indent-defun |
Date: |
Thu, 22 Dec 2022 03:46:23 -0500 (EST) |
branch: emacs-29
commit 7dea58b88db3e272e01e537a3a5d2158ef7f9608
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>
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.
---
lisp/progmodes/c-ts-mode.el | 11 ++++-------
lisp/treesit.el | 23 +++++++++++++++++++++++
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 8ed1a77637..ea9891f334 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 e4f3698dcd..a7882dda2c 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)