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

From: Juri Linkov <[email-masked]>
Date: Wed, 04 Jun 2025 20:16:02 +0300

> Hmm, not sure what I’m doing wrong but I still can’t trigger the
> error. I’m using emacs -q, with Stefan’s patch, enabled liquid mode
> and outline-minor-mode, and deleted the <script> tag on line 19.
> Any ideas?

Sorry, I missed essential non-default settings:

  (setq outline-minor-mode-cycle t)
  (setq outline-minor-mode-use-buttons t)

Also (setq debug-on-error t) is nice to have.
So here is a complete test case:

0. emacs -Q
1. M-: (setq outline-minor-mode-cycle t)
2. M-: (setq outline-minor-mode-use-buttons t)
3. M-: (setq debug-on-error t)
4. C-x p f test/manual/indent/html-multi.html
5. M-x load-library RET treesit-x
6. M-x liquid-generic-ts-mode
7. M-x outline-minor-mode
8. move point to the first 's' in 'script' on line 19
9. type 'M-d' ('kill-word')

>>> 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.
>
> Thanks. Digging further, I’m only hitting this problem because I have
> outline-minor-mode-cycle set to t. So technically with default
> settings, one wouldn’t have this problem.
>
> But I can’t be the only one that sets outline-minor-mode-cycle to t,
> expecting to only cycle outline sections in comments. Can we do something
> to prevent people tripping on this? Maybe change the default value of
> outline-minor-mode-cycle-filter to exclude code?

Do you use the default 'outline-regexp'?  For example in emacs-lisp-mode
it matches not only comments, but also opening parens at the beginning
of function definitions in code.  So I don't understand how it would be
useful to fold only comments, but not code.