Subject: Re: bug#73880: Master: emacs-lisp-mode: Tab completion for a function position fails in a `let' form.

From: Alan Mackenzie <[email-masked]>
Date: Mon, 28 Oct 2024 12:12:25 +0000

Hello, Dmitry.

On Sun, Oct 27, 2024 at 03:44:46 +0200, Dmitry Gutov wrote:
> Hi Alan,

> On 26/10/2024 17:35, Alan Mackenzie wrote:

> > I haven't tried it out your patch yet, but surely it will fail when there
> > are comments in the `let' form.  For that matter, forward-symbol doesn't
> > handle comments, either.

> I think it's only relevant if there's a comment between 'let' and the 
> var-bindings form ('()' in our example), which must happen very rarely, 
> if at all (since it requires moving the form to the next line). Any 
> comments inside the var-bindings form won't get in our way, and any 
> comment after it would just make the check fail, which seems good for 
> our scenario.

Yes.  I should have tried it out first before replying.  As you say,
comments inside the empty binding list or between binding list and first
form don't prevent your patch from working.

> If skipping over comments really was needed, we could try

>    (forward-comment -1)
>    (skip-syntax-backward " >w_")

> But probably not.

Indeed not!

> >> This satisfies the test, at least.

> > OK.

> > I've just looked at another form which doesn't work optimally, namely:

> >      `(let (match-b

> > ..  Here a M-TAB ought to signal "No match", but instead offers the two
> > functions.  If the backquote is removed, it works as it should.

> This seems to be as designed: since the form is quoted, we can't be 
> certain whether the symbol in function position is in fact a function, 
> or whether it will be processed some other way - not necessarily 
> evaluated. So we accept all kinds of known symbols.

> Perhaps this could be improved, but at least that's the original intent.

OK, I can understand that.  For `(let and `(let*, it seems it's almost
always going to be a form being generated in a macro.  But if we were to
special-case those, there are other symbols we could special-case too,
and before long the function would be unmaintainably complicated, for
relatively little gain.

So I'll withdraw my complaint about `(let (match-b.

I think your patch is better than my suggested fix, since it's much
shorter and does the job.  I would be happy if you committed it and
closed the bug.

Thanks!

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).