unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "João Paulo Labegalini de Carvalho" <jaopaulolc@gmail.com>
To: Yuan Fu <casouri@gmail.com>
Cc: Stefan Monnier <monnier@iro.umontreal.ca>,
	Alan Mackenzie <acm@muc.de>,
	emacs-devel@gnu.org
Subject: Re: New defun navigation for tree-sitter (Was: Code navigation for sh-mode with Tree-sitter)
Date: Tue, 13 Dec 2022 09:11:41 -0700	[thread overview]
Message-ID: <CAGjvy29sD+dvxQ12cynigDzLyGfkRDzo6UZavx3Q8EEHRF7Q3w@mail.gmail.com> (raw)
In-Reply-To: <5BB6E79A-B1FA-40F4-B48A-DADF63A30DDC@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 4250 bytes --]

Great job, Yuan.

The new `treesit--navigate-defun' does work as documented. However, the
behavior does feel a little awkward to me.

For instance, if I am within a function I would expect to go to its
beginning when pressing C-M-a, and not to the beginning of the first leaf
function when searching backward. Although the current behavior might be
desirable to some users and should be possible as well.

The navigation style that I came up with for bash-ts-mode is to navigate
only to functions in the same level or higher of the tree. That seems to be
the motions I usually rely on when writing/editing code. But that might
just be me.

Nevertheless, I do agree with you that large changes would be required to
enable proper navigation in the presence of nested functions via the
existing beginning/end-of-defun functions.

On Mon, Dec 12, 2022 at 10:20 PM Yuan Fu <casouri@gmail.com> wrote:

> Thanks to Alan and João, I have revamped the defun navigation of
> tree-sitter, now major modes can get accurate defun navigation by setting
> treesit-defun-type-regexp (as before), and switch between top-level-only
> mode and nested defun mode by treesit-defun-tactic (new).
>
> The change I pushed doesn’t replace the old functions, my plan is to
> replace the existing ones if we think this change is ok for the release
> branch. After experimenting and implementing this, I don’t think the
> current beginning/end-of-defun can support nested navigation without large
> changes. So I’d prefer we use new beg/end-of-defun commands in tree-sitter
> major modes. And we later think about merging the two.
>
> I also added comprehensive tests to the defun navigation[1], which should
> give us more peace in mind. Although this is a large change, I hope it can
> stay on the release branch because (1) it fixes current bugs (2) it has a
> comprehensive test.
>
> Yuan
>
> [1] For tests, see
> treesit-defun-navigation-nested-1
> treesit-defun-navigation-nested-2
> treesit-defun-navigation-nested-3
> treesit-defun-navigation-top-level
>
> It tests all possible defun navigations starting from all possible
> starting positions (that I can think of), so it should be pretty
> comprehensive. I currently have test for python, js, and bash. New tests
> can be easily added.
>
> The test program is like the following, we mark positions with markers
> like [100]
>
> [100]
> [101]class Class1():
> [999]    prop = 0
> [102]
> [103]class Class2():[0]
> [104]    [1]def method1():
> [999]        [2]return 0[3]
> [105]    [4]
> [106]    [5]def method2():
> [999]        [6]return 0[7]
> [107]    [8]
> [999]    prop = 0[9]
> [108]
> [109]class Class3():
> [999]    prop = 0[10]
> [110]
>
> Then we have a list of positions like this, basically saying “if point is
> at marker X, and we find the next/previous beginning/end of defun, point
> should end up at Y”, and we have X for all the possible positions in a
> nested defun, and Y for all four operations. So the first line says “if we
> start at marker 0, and find prev-beg-of-defun, we should end up at marker
> 103”.
>
> ;; START PREV-BEG NEXT-END PREV-END NEXT-BEG
>   '((0 103 105 102 106) ; Between Beg of parent & 1st sibling.
>     (1 103 105 102 106) ; Beg of 1st sibling.
>     (2 104 105 102 106) ; Inside 1st sibling.
>     (3 104 107 102 109) ; End of 1st sibling.
>     (4 104 107 102 109) ; Between 1st sibling & 2nd sibling.
>     (5 104 107 102 109) ; Beg of 2nd sibling.
>     (6 106 107 105 109) ; Inside 2nd sibling.
>     (7 106 108 105 109) ; End of 2nd sibling.
>     (8 106 108 105 109) ; Between 2nd sibling & end of parent.
>     (9 103 110 102 nil) ; End of parent.
>
>     (100 nil 102 nil 103) ; Before 1st parent.
>     (101 nil 102 nil 103) ; Beg of 1st parent.
>     (102 101 108 nil 109) ; Between 1st & 2nd parent.
>     (103 101 108 nil 109) ; Beg of 2nd parent.
>     (110 109 nil 108 nil) ; After 3rd parent.
>     )
>
>
>

-- 
João Paulo L. de Carvalho
Ph.D Computer Science |  IC-UNICAMP | Campinas , SP - Brazil
Postdoctoral Research Fellow | University of Alberta | Edmonton, AB - Canada
joao.carvalho@ic.unicamp.br
joao.carvalho@ualberta.ca

[-- Attachment #2: Type: text/html, Size: 4989 bytes --]

  reply	other threads:[~2022-12-13 16:11 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-03 20:23 Code navigation for sh-mode with Tree-sitter João Paulo Labegalini de Carvalho
2022-12-03 21:46 ` Alan Mackenzie
2022-12-05 15:24   ` João Paulo Labegalini de Carvalho
2022-12-05 20:12     ` Stefan Monnier
2022-12-05 21:29       ` Alan Mackenzie
2022-12-05 21:56         ` Stefan Monnier
2022-12-06 15:51       ` João Paulo Labegalini de Carvalho
2022-12-06 16:48         ` Stefan Monnier
2022-12-06 21:04           ` Yuan Fu
2022-12-06 21:08             ` Yuan Fu
2022-12-06 21:40               ` Alan Mackenzie
2022-12-06 21:46                 ` João Paulo Labegalini de Carvalho
2022-12-06 21:55                   ` João Paulo Labegalini de Carvalho
2022-12-06 22:35                     ` Stefan Monnier
2022-12-06 22:41                       ` João Paulo Labegalini de Carvalho
2022-12-06 22:57                       ` Stefan Monnier
2022-12-06 23:43                         ` João Paulo Labegalini de Carvalho
2022-12-06 23:50                           ` Stefan Monnier
2022-12-07  1:12                             ` João Paulo Labegalini de Carvalho
2022-12-07 17:20                               ` João Paulo Labegalini de Carvalho
2022-12-10  4:58                                 ` Yuan Fu
2022-12-13  4:55                                 ` Yuan Fu
2022-12-13 16:00                                   ` João Paulo Labegalini de Carvalho
2022-12-13  5:20                                 ` New defun navigation for tree-sitter (Was: Code navigation for sh-mode with Tree-sitter) Yuan Fu
2022-12-13 16:11                                   ` João Paulo Labegalini de Carvalho [this message]
2022-12-13 16:38                                     ` Eli Zaretskii
2022-12-13 18:03                                       ` João Paulo Labegalini de Carvalho
2022-12-13 18:07                                     ` Yuan Fu
2022-12-13 18:48                                       ` João Paulo Labegalini de Carvalho
2022-12-13 18:56                                         ` Yuan Fu
2022-12-13 19:46                                           ` João Paulo Labegalini de Carvalho
2022-12-16  1:49                                             ` Yuan Fu
2022-12-16 16:24                                               ` João Paulo Labegalini de Carvalho
2022-12-17 23:32                                                 ` Yuan Fu
2022-12-07  0:41                 ` Code navigation for sh-mode with Tree-sitter Yuan Fu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGjvy29sD+dvxQ12cynigDzLyGfkRDzo6UZavx3Q8EEHRF7Q3w@mail.gmail.com \
    --to=jaopaulolc@gmail.com \
    --cc=acm@muc.de \
    --cc=casouri@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).