Subject: bug#61502: 29.0.60; c-ts-mode auto-indent not working

From: Theodor Thornhill <[email-masked]>
Date: Wed, 15 Feb 2023 13:41:47 +0100

Eli Zaretskii <[email-masked]> writes:

>> From: Theodor Thornhill <[email-masked]>
>> Cc: [email-masked], [email-masked], [email-masked]
>> Date: Tue, 14 Feb 2023 21:21:33 +0100
>> 
>> int
>> main
>> {
>>   for (;;)|
>> ```
>> 
>> Now type RET
>> 
>> ```
>> int
>> main
>> {
>>   for (;;)
>> |
>> ```
>> 
>> Now type {
>> 
>> ```
>> int
>> main
>> {
>>   for (;;)
>>     {|
>> ```
>> 
>> Now type RET
>> 
>> ```
>> int
>> main
>> {
>>   for (;;)
>>     {
>> |
>> ```
>> 
>> Which is what I consider a little confusing.  We get different
>> indentation with and without the closed scope.
>
> Any idea why it doesn't choose the 'for' node?  That's what a naïve
> user would expect, I think.

That's what any user should expect, IMO. It's due to
treesit-node-on. See its docstring:

  "Return the smallest node covering BEG to END.

BEWARE!  Calling this function on an empty line that is not
inside any top-level construct (function definition, etc.) most
probably will give you the root node, because the root node is
the smallest node that covers that empty line.  You probably want
to use `treesit-node-at' instead.

Return nil if none was found.  If NAMED is non-nil, only look for
named node.

If PARSER-OR-LANG is a parser, use that parser; if PARSER-OR-LANG
is a language, find the first parser for that language in the
current buffer, or create one if none exists; If PARSER-OR-LANG
is nil, try to guess the language at BEG using `treesit-language-at'."

Rather selecting the first node "above" point sounds more reasonable?

Theo