Subject: bug#78402: treesit after-change-functions

From: Juri Linkov <[email-masked]>
Date: Tue, 03 Jun 2025 18:29:45 +0300

>>>> @@ -4064,6 +4065,7 @@ treesit-outline-search
>>>>  "Search for the next outline heading in the syntax tree.
>>>> For BOUND, MOVE, BACKWARD, LOOKING-AT, see the descriptions in
>>>> `outline-search-function'."
>>>> +  (treesit--pre-redisplay)
>>>>  (if looking-at
>>>>      (when (treesit-outline--at-point) (pos-bol))
>>> 
>>> Alas, the same error:
>> 
>> Gah! Sorry, I don’t have time to properly look into this right now. But I’ll try to find some time as soon as possible (pinky promise).
>
> Hi Juri, how did you produce this error? I tried to use the
> liquid-generic-ts-mode example in bug#77256 but that didn’t trigger
> the error.

You can produce this error by visiting test/manual/indent/html-multi.html
with enabled liquid-generic-ts-mode, then delete the word "script"
(outside of comments).

> BTW, I noticed that when tree-sitter-provided outline is in effect,
> pressing tab on the lines determined as outline titles—like first line
> of a defun—toggles folding instead of indenting the code. That feels
> intrusive IMHO. It’s not a problem for “traditional” kind of outline
> headers in comments, but code is another story.
>
> Take this code as example:
>
> function MyBigFunc(param1
>                   param2) {
>   const abc = 'def';
>   function embed() {
>     return true;
>   }
> }
>
> Right now I can’t indent the embed function, because pressing TAB
> folds it. Another common practice is to select the whole MyBigFunc
> function and press TAB to indent everything in the region, that
> wouldn’t work if point happens to be on the first line, which is
> common.

Indeed, there is a clash between TAB keybindings.
So to address this ambiguity we created a special option
'outline-minor-mode-cycle-filter' that defines in what context
TAB should fold outlines.  For example, you can customize:

  (setopt outline-minor-mode-cycle-filter (lambda () (bolp)))

Then TAB will fold only when pressed at the beginning of the line.
Anywhere else TAB will indent the line.