Subject: Re: bug#78458: 31.0.50; treesit.el: thing navigation functions work incorrectly with some Clojure nodes

From: Roman Rudakov <[email-masked]>
Date: Mon, 19 May 2025 21:29:53 +0200

Roman Rudakov <[email-masked]> writes:

> Juri Linkov <[email-masked]> writes:
>
>>>> +      (setq-local down-list-function
>>>> +                  (lambda (&optional arg)
>>>> +                    (let ((treesit-sexp-type-regexp 'sexp))
>>>> +                      (treesit-down-list arg))))
>>>> +      (setq-local up-list-function
>>>> +                  (lambda (&optional arg escape-strings
>>>> no-syntax-crossing)
>>>> +                    (let ((treesit-sexp-type-regexp 'sexp))
>>>> +                      (treesit-up-list arg escape-strings
>>>> no-syntax-crossing))))
>>>> +
>>>>        ;; Workaround for treesit-transpose-sexps not correctly
>>>>        working with
>>>>        ;; treesit-thing-settings on Emacs 30.
>>>>        ;; Once treesit-transpose-sexps it working again this can
>>>>        be removed
>>> Thank you very much for the patch Juri. It indeed solves all of 
>>> the
>>> problems I mentioned.  However while I was testing the patch I
>>> noticed that
>>> the 'down-list' function behaves a bit odd. If I call it multiple
>>> times
>>> starting from the beginning of the line it moves the point to the
>>> following
>>> positions:
>>>
>>> #|(-> (.-value (.-target %)))
>>> #(->| (.-value (.-target %)))
>>> #(-> (.-value| (.-target %)))
>>> #(-> (.-value| (|.-target %)))
>>> #(-> (.-value| (.-target| %)))
>>> #(-> (.-value| (.-target %|)))
>>
>> Then please remove '(setq-local down-list-function ..' from the
>> patch,
>> it's not needed.
>>
>>> While it would be more logical to have:
>>>
>>> #(|-> (.-value (.-target %)))
>>> #(-> (|.-value (.-target %)))
>>> #(-> (.-value (|.-target %)))
>>
>> Without redefining 'down-list-function'
>> the 'down-list' function behaves like above.
>>
>> But we can do nothing to fix the first step:
>>
>> #|(-> (.-value (.-target %)))
>>
>> because using treesit nodes, "#" is a child node of
>> 'anon_fn_lit', so 'down-list' goes after it.
>>
>> Since the treesit grammar can't handle this case,
>> you could try to use the default function by
>>
>>   (setq-local down-list-function nil)
> Thank you! That is very helpful. I was able to use your patch with
> small modifications to make it work for function literals and sets
> (that have the same # marker node).  I'll try to discuss with the
> author of the grammar possibility to modify it to have just one
> 'open:' node instead of two.
>
> I think this bug can be closed now.
One more question.  Will the trick with defining 'sexp-default' work 
in Emacs 30?  Or is it a new "thing" which is only available in 
master?
--
Best regards, Roman