Subject: Re: bug#62416: 30.0.50; Symbols skipped in the navigation in ruby-ts-mode

From: Dmitry Gutov <[email-masked]>
Date: Sun, 26 Mar 2023 05:14:35 +0300

On 25/03/2023 21:04, Juri Linkov wrote:
>>> Navigating word forward/backward skips the Ruby symbol in the ruby-ts-mode.
>>> Adding "simple_symbol" to the treesit-sexp-type-regexp is fixing it.
>>>     (setq-local treesit-sexp-type-regexp
>>>                 (regexp-opt '("class"
>>>                               "module"
>>>                               "method"
>>>                               "argument_list"
>>>                               "array"
>>>                               "hash"
>>>                               "parenthesized_statements"
>>>                               "if"
>>>                               "case"
>>>                               "when"
>>>                               "block"
>>>                               "do_block"
>>>                               "begin"
>>>                               "binary"
>>>                               "simple_symbol" ;; <-- missing
>>>                               "assignment")))
>>
>> Juri, what do you think?
>>
>> In the context of your previous feedback regarding sexp navigation in
>> ruby-ts-mode.
> 
> This is fine.

Good. Let's push it into master.

> But anyway I think in its current state
> treesit-sexp-type-regexp is underdesigned as noted in
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62238#59
> so no tweaking could fix its design flaws.  For example,
> 
>    foo = {
>      a: b
>    }
> 
> when point is on the left curly bracket, 'C-M-f C-M-b' doesn't
> move back to the original position, etc.

Hm, yeah, it's a little unexpected that not only it doesn't move back 
exactly, it skips the full assignment expression in both directions.

What is the downside of dropping "binary" and "assignment" from 
treesit-sexp-type-regexp, added there not too long ago? Without 
"assignment" there, your example becomes a round-trip.

BTW, we should wrap the regexp with \`...\'. It currently does substring 
matching, that's why it also matches "identifier" (which should probably 
be added too).