bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#68824: treesitter support for outline-minor-mode


From: Juri Linkov
Subject: bug#68824: treesitter support for outline-minor-mode
Date: Thu, 01 Feb 2024 19:12:17 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (x86_64-pc-linux-gnu)

Yuan, do you think it makes sense to add a new optional arg to
'treesit-search-forward' that will define the traversal order?

The problem is that to search the next outline heading in
outline-minor-mode, there is a need to visit headings in
the same order as they appear in the buffer
where a parent is located before its children:

* Parent
** Child 1
** Child 2

Currently 'treesit-search-forward' returns "Child 1" before "Parent".

This means that 'treesit-search-forward' should return the
topmost matched parent instead of starting to traverse children
from the deepest leaf.

IOW, it's necessary to traverse nodes in this order:

                  o
                  |
                  ะพ---------------------11
                  |                     |
         o--------S----------3          12
         |        |          |
    o--o-+--o  1--+--2    4--+-----7
    |  |                  |        |
    o  o                +-+-+   +--+--+
                        |   |   |  |  |
                        5   6   8  9  10

Please note there is no 11 or 12 at the parent of S node because
it should traverse only the remaining siblings of the parent.
This is because remaining parent siblings have treesit-node-start
positions greater than treesit-node-start of S node.

> +(defun treesit-outline-search (&optional bound move backward looking-at)
> +  (let* ((current (treesit-node-at (pos-bol)))
> +         (current (or (treesit-parent-until current 
> treesit-outline-predicate)
> +                      current))
> +         (node (treesit-search-forward
> +                 current treesit-outline-predicate backward))





reply via email to

[Prev in Thread] Current Thread [Next in Thread]