bug#81533: c-ts-mode: Improved block comment indentation

Eli Zaretskii <[email protected]> Sun, 02 Aug 2026 08:53:13 +0300
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
> From: Björn Lindqvist <[email protected]>
> Date: Sun, 2 Aug 2026 02:37:02 +0200
> 
> I was unhappy with the way c-ts-mode indents block comments so I
> fixed it. :) Two examples, with <T> marking the point's
> position when pressing TAB. Here "second" should align to "first":
> 
> int foo; /* first
> <T>second */
> 
> int foo; /* first
> 
> <T>second */
> 
> The attached patch modifies the c-ts-mode block comment indentation
> rules so that
> 
> 1) lines beginning with "*" are aligned to the first "*",
> 2) lines following the first or blank lines are indented three spaces,
> 3) and other lines are aligned to the previous line.
> 
> The rules work for like 99% of all block comments and is how both
> Emacs and CPython overwhelmingly indents them. I tried to incorporate
> my changes into the existing prev-adaptive-prefix system but couldn't
> make it work so I wrote new code instead.

Thanks.  Yuan and Stefan, any comments?

> From 856989429f54fd64d7e9d3ae9ba1d9b7f9ceff09 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= <[email protected]>
> Date: Sun, 1 Aug 2026 10:18:22 +0200
> Subject: [PATCH] c-ts-mode: Improved block comment indentation
> 
> 1) lines beginning with "*" are aligned to the first "*"
> 2) lines following the first or blank lines are indented three spaces
> 3) other lines are aligned to the previous line
> 
> * lisp/progmodes/c-ts-mode.el (c-ts-mode--simple-indent-rules): Improved
>   block comment indentation.
> ---
>  lisp/progmodes/c-ts-mode.el | 31 ++++++++++++++++++++++---------
>  1 file changed, 22 insertions(+), 9 deletions(-)
> 
> diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
> index 5f064716a89..ecf1e6ca635 100644
> --- a/lisp/progmodes/c-ts-mode.el
> +++ b/lisp/progmodes/c-ts-mode.el
> @@ -473,6 +473,27 @@ c-ts-mode--emacs-macro-rules
>      (cons (treesit-node-start parent)
>            c-ts-indent-offset))))
> 
> +(defun c-ts-mode--block-comment-offset (_n parent bol &rest _)
> +  "Indentation offset for lines in block comments.
> +
> +One space if line starts with \"*\", three if the previous line is blank
> +or the first line of the comment, and otherwise same as previous line."
> +  (save-excursion
> +    (beginning-of-line)
> +    (let* ((c-point (treesit-node-start parent))
> +	   (c-row (line-number-at-pos c-point))
> +	   ;; Make this a builtin!
> +	   (c-col (save-excursion (goto-char c-point) (current-column)))
> +	   (starred? (looking-at-p (rx (* blank) "*")))
> +           (p-row (line-number-at-pos nil t)))
> +      (forward-line -1)
> +      (let ((prev-indent (current-indentation)))
> +	(if starred?
> +	    1
> +          (if (or (<= (- p-row c-row) 1) (= prev-indent 0))
> +              3
> +            (- prev-indent c-col)))))))
> +
>  (defun c-ts-mode--simple-indent-rules (mode style)
>    "Return the indent rules for MODE and STYLE.
> 
> @@ -513,15 +534,7 @@ c-ts-mode--simple-indent-rules
>             ;; ((match nil "function_declarator" "parameters") parent 0)
>             ;; ((parent-is "template_declaration") parent 0)
> 
> -           ;; `c-ts-common-looking-at-star' has to come before
> -           ;; `c-ts-common-comment-2nd-line-matcher'.
> -           ;; FIXME: consolidate into a single rule.
> -           ((and (parent-is "comment") c-ts-common-looking-at-star)
> -            c-ts-common-comment-start-after-first-star -1)
> -           (c-ts-common-comment-2nd-line-matcher
> -            c-ts-common-comment-2nd-line-anchor
> -            1)
> -           ((parent-is "comment") prev-adaptive-prefix 0)
> +           ((parent-is "comment") parent c-ts-mode--block-comment-offset)
> 
>             ;; Preproc directives
>             ((node-is "preproc_arg") no-indent)
> --
> 2.55.0