From: Alan Mackenzie <acm@muc.de>
To: "João Paulo Labegalini de Carvalho" <jaopaulolc@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: Code navigation for sh-mode with Tree-sitter
Date: Sat, 3 Dec 2022 21:46:34 +0000 [thread overview]
Message-ID: <Y4vDumJgrf1yOxvC@ACM> (raw)
In-Reply-To: <CAGjvy2-FPGt9o=31MuOh4U3JwPpwoLu0OR+L2Oi3f4GPw_K93g@mail.gmail.com>
Hello, João.
On Sat, Dec 03, 2022 at 13:23:25 -0700, João Paulo Labegalini de Carvalho wrote:
> Hi all,
> I am working on basic navigation for sh-mode. My idea is that in sh-mode
> invoking C-M-a or C-M-e moves point to the beginning/end of the
> surrounding function if the point was inside of said function or to the
> beginning/end of the next/previous top-level function otherwise.
> I got the functions to do so in the attached patch (I did not include the
> C-M-a with a negative argument yet).
> If the functions are defined and used in isolation they work as intended.
> However, because `end-of-defun' calls `beginning-of-defun-raw' (which,
> AFAIK, uses `beginning-of-defun-function') it causes the C-M-e to not work
> when the point is not inside of a function.
Yes. beginning-of-defun and end-of-defun are broken, and have been for
a long time. They cannot, in general, work, for the reason you've just
noted.
The problem has been raised on emacs-devel before, without the problem
getting solved. CC Mode, for example, works around the problem by
binding c-beginning-of-defun and c-end-of-defun directly to C-M-a and
C-M-e, bypassing the offending code.
The tactic of using beginning-of-defun-raw is only valid in certain
circumstances, and is an inappropriate inefficiency in modes such as
the one you're writing, where it is just as easy to go directly to an
end of defun as a beginning of defun.
> What I think is happening is that, when `end-of-defun' calls
> `beginning-of-defun-raw' it brings point to the beginning of a top-level
> function, so the subsequent call to `end-of-defun' moves point to the start
> location, does it make it seems as the point did not move.
Yes. I suggest you submit a bug report for this bug.
To work properly, beginning/end-of-defun need to know whether the
starting point is inside a defun or between defuns. Your patch includes
a macro which determines this (as CC Mode includes a function which
determines this). Possibly, a proper bug fix might include a function
supplied by the major mode for this analysis.
> I have also noticed that calling the private function I defined directly
> via M-: brings the point to a slightly different location. For example:
> <---- point before C-M-e
> A {
> } <--- point after M-: (sh-mode--treesit-end-of-defun)
> <---- pint after C-M-e
> Calling sh-mode--treesit-end-of-defun brings the point right after the
> closing curly brace and with C-M-e the point is positioned at the next line.
This is C-M-e deciding that the end of defun should be defined as
somewhere else other than the end of the function. It seems as though
there ought to be an end-of-defun-raw function (which would be usable by
programs) and an end-of-defun which puts point where interactive use
supposedly wants it to be.
> That might be due to additional processing done inside `end-of-defun'.
Indeed.
> So, would it be ok to override `beginning-of-defun' and `end-of-defun' and
> thus have bash-ts-mode use the functions I wrote directly? If so, how could
> I do that? If not, how can I fix the "miss-behavior"?
As already mentioned, you could bind C-M-a and C-M-e directly to your
new functions in the major mode map. Other than that, I'm convinced the
misbehaviour cannot be fixed without fixing the basic functions in
emacs-lisp/lisp.el. Hence the suggestion of a bug report.
> I would appreciate all feedback and suggestions.
> --
> 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
[ .... ]
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2022-12-03 21:46 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 [this message]
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
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y4vDumJgrf1yOxvC@ACM \
--to=acm@muc.de \
--cc=emacs-devel@gnu.org \
--cc=jaopaulolc@gmail.com \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.