GNU bug report logs - #78402
treesit after-change-functions

Previous Next

Package: emacs;

Reported by: Juri Linkov <juri <at> linkov.net>

Date: Tue, 13 May 2025 06:34:02 UTC

Severity: normal

Full log


View this message in rfc822 format

From: Juri Linkov <juri <at> linkov.net>
To: Yuan Fu <casouri <at> gmail.com>
Cc: Stefan Monnier <monnier <at> iro.umontreal.ca>, 78402 <at> debbugs.gnu.org
Subject: bug#78402: treesit after-change-functions
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.




This bug report was last modified 11 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.