On 20/08/2024 12:40, João Távora wrote: > On Tue, Aug 20, 2024 at 3:08 AM Dmitry Gutov wrote: > >> So far I've tested with gopls and clangd (when writing the new tests), >> typescript-language-server and rust-analyzer. > > That's pretty good. If you could add pylsp or pyright (basedpyright), > I'd feel even more confident. Installed pylsp with apt - the basic things I tested seem to work too. > I don't have time to spend examining these details, just the final > outcome is relevant: partial completions cannot be inserted, but > fragments of a completion can be completed to a fully formed > completion (eventually running exit-function then). And only fragments that prefix-match all completions as prefix. exit-function seems to function. >> The report that's referenced in the 3 commits your mentioned does seem >> to have regressed is https://github.com/joaotavora/eglot/issues/1339 >> not to the original behavior (exit-function still works), but C-M-i >> changes buffer text to >> >> v.call1234.1234567890 > > I don't have time to investigate right now, but indeed that issue there were > two consecutive fixes: the first one (which you say "still works") and a second > one which I eventually reverted because it fixes some things and broke > others. Now that I've looked at them a few more times - all 3 changes were in the completion table, whereas I'm altering the completion style here. And indeed what seems to be the crux of the previous improvement (working exit-function) stays around. > So is the regression you mention in relation to the current Eglot state or > to that intermediate state? In relation to the current state, but I think I've figured it out - see the new revision attached. So what I think what was happening, is since the style was returning nil when the input has a non-matching suffix, the 'emacs22' style came into play (style which only looks at the prefix) and expanded the input from "c" to "call". Anyway, the attached avoids the failover by returning non-nil in the last clause, if at least the prefix matches the table. That makes "C-M-i" keep the input at "v.c|1234" (with two completions: "match" and "call") - but selecting either of the completions using Company or the mouse, or M-RET, expands each into the corresponding snippet, which seems most optimal all-around. See the new test 'eglot-test-try-completion-inside-symbol' inside the patch. Wasn't sure whether to make it use 'completion-try-completion' or 'completion-at-point', but the former seems more explicit.