GNU bug report logs - #76606
30.1; Conflict between completion-preview and yasnippet

Previous Next

Package: emacs;

Reported by: Vincent Foley <vfoley <at> gmail.com>

Date: Thu, 27 Feb 2025 04:29:01 UTC

Severity: normal

Found in version 30.1

Fixed in version 30.2

Done: Eshel Yaron <me <at> eshelyaron.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 76606 in the body.
You can then email your comments to 76606 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 04:29:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Vincent Foley <vfoley <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 27 Feb 2025 04:29:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Vincent Foley <vfoley <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 30.1; Conflict between completion-preview and yasnippet
Date: Wed, 26 Feb 2025 20:29:16 -0330
[Message part 1 (text/plain, inline)]
In Emacs 30.1, completion-preview and yasnippet appear to conflict with
each other. In a c-mode buffer with eglot, yasnippet, and
completion-preview enabled, accepting a completion from
completion-preview with M-i inserts the formal parameters over and over
again.

        // Initial state -- cursor is at the pipe (|);
        int add(int x, int y) { return x + y; }
        int f(void) { |

        // Type "add"; completion-preview activates and proposes a
        // completion (the text `(int x, int y)` is not actual text,
        // but an overlay in a lighter color and underlined.)
        int add(int x, int y) { return x + y; }
        int f(void) { add|(int x, int y)

        // Pressing M-i to accept the completion moves the cursor
        // inside the parentheses, but confusingly creates a copy
        // of the parameters outside the parentheses.
        int add(int x, int y) { return x + y; }
        int f(void) { add(|int x, int y)int x, int y)

        // Pressing M-i again adds more text to the end of the line
        int add(int x, int y) { return x + y; }
        int f(void) { add(|int x, int y)int x, int y), int y)

The following init.el should be sufficient to reproduce the bug.
I used the clangd LSP from the Debian apt repositories.

        (package-initialize)
        (use-package eglot
          :hook (c-mode . eglot-ensure))
        (use-package completion-preview
          :hook (c-mode . completion-preview-mode))
        (use-package yasnippet
          :hook (c-mode . yas-minor-mode))

In GNU Emacs 30.1 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.24.43,
 cairo version 1.18.2) of 2025-02-26 built on x1
Windowing system distributor 'The X.Org Foundation', version 11.0.12101015
System Description: Debian GNU/Linux trixie/sid

Configured using:
 'configure --prefix=/home/vfoley/.local --with-native-compilation=aot'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG
LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER
PNG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER
WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB

Important settings:
  value of $LC_ALL: en_US.utf8
  value of $LANG: en_US.utf8
  locale-coding-system: utf-8-unix

Major mode: C/*l

Minor modes in effect:
  eglot-inlay-hints-mode: t
  eglot--managed-mode: t
  flymake-mode: t
  completion-preview-mode: t
  yas-minor-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  abbrev-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message yank-media puny dired
dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config
gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util
mail-prsvr mail-utils time-date comp-run comp-common rx eglot
external-completion jsonrpc xref flymake thingatpt project compat diff
diff-mode track-changes easy-mmode ert pp ewoc debug backtrace find-func
filenotify warnings compile text-property-search comint ansi-osc
ansi-color ring pcase imenu completion-preview yasnippet cc-mode
cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars
cc-defs cl-extra help-mode use-package-core finder-inf
yasnippet-autoloads package browse-url url url-proxy url-privacy
url-expand url-methods url-history url-cookie generate-lisp-file
url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs icons password-cache json subr-x map byte-opt
gv bytecomp byte-compile url-vars cl-loaddefs cl-lib rmc iso-transl
tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd
touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list
replace newcomment text-mode lisp-mode prog-mode register page tab-bar
menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse
jit-lock font-lock syntax font-core term/tty-colors frame minibuffer
nadvice seq simple cl-generic indonesian philippine cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop
case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo gtk x-toolkit xinput2 x multi-tty move-toolbar
make-network-process native-compile emacs)

Memory information:
((conses 16 254279 18736) (symbols 48 15078 0) (strings 32 66912 2838)
 (string-bytes 1 2272245) (vectors 16 41013)
 (vector-slots 8 418802 16721) (floats 8 88 172) (intervals 56 1405 0)
 (buffers 992 18))
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 07:51:02 GMT) Full text and rfc822 format available.

Message #8 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eshel Yaron <me <at> eshelyaron.com>
To: Vincent Foley <vfoley <at> gmail.com>
Cc: 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 08:50:21 +0100
Hi there,

Vincent Foley <vfoley <at> gmail.com> writes:

> In Emacs 30.1, completion-preview and yasnippet appear to conflict with
> each other. In a c-mode buffer with eglot, yasnippet, and
> completion-preview enabled, accepting a completion from
> completion-preview with M-i inserts the formal parameters over and over
> again.
>
>         // Initial state -- cursor is at the pipe (|);
>         int add(int x, int y) { return x + y; }
>         int f(void) { |
>
>         // Type "add"; completion-preview activates and proposes a
>         // completion (the text `(int x, int y)` is not actual text,
>         // but an overlay in a lighter color and underlined.)
>         int add(int x, int y) { return x + y; }
>         int f(void) { add|(int x, int y)
>
>         // Pressing M-i to accept the completion moves the cursor
>         // inside the parentheses, but confusingly creates a copy
>         // of the parameters outside the parentheses.
>         int add(int x, int y) { return x + y; }
>         int f(void) { add(|int x, int y)int x, int y)
>
>         // Pressing M-i again adds more text to the end of the line
>         int add(int x, int y) { return x + y; }
>         int f(void) { add(|int x, int y)int x, int y), int y)
>         
> The following init.el should be sufficient to reproduce the bug.
> I used the clangd LSP from the Debian apt repositories.
>
>         (package-initialize)
>         (use-package eglot
>           :hook (c-mode . eglot-ensure))
>         (use-package completion-preview
>           :hook (c-mode . completion-preview-mode))
>         (use-package yasnippet
>           :hook (c-mode . yas-minor-mode))

Thank you for the detailed report.  I can reproduce the issue.

A general note: TAB (completion-preview-insert) accepts the whole
completion suggestion, while M-i (completion-preview-complete) only
inserts the common prefix of all completion candidates.  In this case
these happen to be the same since there's only one candidate, expect
that TAB doesn't suffer from the problem you've stumbled upon.

The following diff should fix this bug, could you please test it?

diff --git a/lisp/completion-preview.el b/lisp/completion-preview.el
index 4928d9a8824..eb4b9111b30 100644
--- a/lisp/completion-preview.el
+++ b/lisp/completion-preview.el
@@ -520,6 +520,7 @@ completion-preview-complete
             ;; hook update the completion preview in case the candidate
             ;; can be completed further.
             (when (functionp efn)
+              (completion-preview-active-mode -1)
               (funcall efn (concat base com) (if (cdr all) 'exact 'finished)))
           ;; Otherwise, remove the common prefix from the preview.
           (completion-preview--inhibit-update)



Regards,

Eshel




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 08:37:01 GMT) Full text and rfc822 format available.

Message #11 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Vincent Foley <vfoley <at> gmail.com>, Eshel Yaron <me <at> eshelyaron.com>,
 João Távora <joaotavora <at> gmail.com>
Cc: 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 10:36:03 +0200
> From: Vincent Foley <vfoley <at> gmail.com>
> Date: Wed, 26 Feb 2025 20:29:16 -0330
> 
> In Emacs 30.1, completion-preview and yasnippet appear to conflict with
> each other. In a c-mode buffer with eglot, yasnippet, and
> completion-preview enabled, accepting a completion from
> completion-preview with M-i inserts the formal parameters over and over
> again.
> 
>         // Initial state -- cursor is at the pipe (|);
>         int add(int x, int y) { return x + y; }
>         int f(void) { |
> 
>         // Type "add"; completion-preview activates and proposes a
>         // completion (the text `(int x, int y)` is not actual text,
>         // but an overlay in a lighter color and underlined.)
>         int add(int x, int y) { return x + y; }
>         int f(void) { add|(int x, int y)
> 
>         // Pressing M-i to accept the completion moves the cursor
>         // inside the parentheses, but confusingly creates a copy
>         // of the parameters outside the parentheses.
>         int add(int x, int y) { return x + y; }
>         int f(void) { add(|int x, int y)int x, int y)
> 
>         // Pressing M-i again adds more text to the end of the line
>         int add(int x, int y) { return x + y; }
>         int f(void) { add(|int x, int y)int x, int y), int y)
>         
> The following init.el should be sufficient to reproduce the bug.
> I used the clangd LSP from the Debian apt repositories.
> 
>         (package-initialize)
>         (use-package eglot
>           :hook (c-mode . eglot-ensure))
>         (use-package completion-preview
>           :hook (c-mode . completion-preview-mode))
>         (use-package yasnippet
>           :hook (c-mode . yas-minor-mode))

Thanks, I'm adding Eshel and João to this discussion.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 08:54:02 GMT) Full text and rfc822 format available.

Message #14 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eshel Yaron <me <at> eshelyaron.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: Vincent Foley <vfoley <at> gmail.com>,
 João Távora <joaotavora <at> gmail.com>, 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 09:53:01 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

> Thanks, I'm adding Eshel and João to this discussion.

Thanks Eli, I already took a look and saw the cause (and hopefully a fix)
in completion-preview.el, see my reply to Vincent.


Eshel




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 09:04:01 GMT) Full text and rfc822 format available.

Message #17 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: vfoley <at> gmail.com, joaotavora <at> gmail.com, 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 11:03:24 +0200
> From: Eshel Yaron <me <at> eshelyaron.com>
> Cc: Vincent Foley <vfoley <at> gmail.com>,  João Távora
>  <joaotavora <at> gmail.com>,
>   76606 <at> debbugs.gnu.org
> Date: Thu, 27 Feb 2025 09:53:01 +0100
> 
> Eli Zaretskii <eliz <at> gnu.org> writes:
> 
> > Thanks, I'm adding Eshel and João to this discussion.
> 
> Thanks Eli, I already took a look and saw the cause (and hopefully a fix)
> in completion-preview.el, see my reply to Vincent.

Thanks!




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 13:17:02 GMT) Full text and rfc822 format available.

Message #20 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Vincent Foley <vfoley <at> gmail.com>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 09:45:50 -0330
[Message part 1 (text/plain, inline)]
>
> The following diff should fix this bug, could you please test it?
>
> diff --git a/lisp/completion-preview.el b/lisp/completion-preview.el
> index 4928d9a8824..eb4b9111b30 100644
> --- a/lisp/completion-preview.el
> +++ b/lisp/completion-preview.el
> @@ -520,6 +520,7 @@ completion-preview-complete
>              ;; hook update the completion preview in case the candidate
>              ;; can be completed further.
>              (when (functionp efn)
> +              (completion-preview-active-mode -1)
>                (funcall efn (concat base com) (if (cdr all) 'exact
> 'finished)))
>            ;; Otherwise, remove the common prefix from the preview.
>            (completion-preview--inhibit-update)
>
>
>
> Regards,
>
> Eshel
>

Hi Eshel,

 I applied this patch to my emacs-30.1 source tree and I can confirm that
it fixes the issue. Thank you for addressing this so quickly!

Vincent
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 13:46:03 GMT) Full text and rfc822 format available.

Message #23 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eshel Yaron <me <at> eshelyaron.com>
To: Vincent Foley <vfoley <at> gmail.com>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 14:45:01 +0100
Vincent Foley <vfoley <at> gmail.com> writes:

>> The following diff should fix this bug, could you please test it?
>>
>> diff --git a/lisp/completion-preview.el b/lisp/completion-preview.el
>> index 4928d9a8824..eb4b9111b30 100644
>> --- a/lisp/completion-preview.el
>> +++ b/lisp/completion-preview.el
>> @@ -520,6 +520,7 @@ completion-preview-complete
>>              ;; hook update the completion preview in case the candidate
>>              ;; can be completed further.
>>              (when (functionp efn)
>> +              (completion-preview-active-mode -1)
>>                (funcall efn (concat base com) (if (cdr all) 'exact 'finished)))
>>            ;; Otherwise, remove the common prefix from the preview.
>>            (completion-preview--inhibit-update)
>>
>> Regards,
>>
>> Eshel
>
> Hi Eshel,
>
> I applied this patch to my emacs-30.1 source tree and I can confirm that
> it fixes the issue. Thank you for addressing this so quickly!

Great, thanks for confirming.

Eli, is this fix OK for the emacs-30 branch or should it go to master?


Eshel




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 14:18:02 GMT) Full text and rfc822 format available.

Message #26 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: vfoley <at> gmail.com, 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 16:17:07 +0200
> From: Eshel Yaron <me <at> eshelyaron.com>
> Cc: 76606 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>
> Date: Thu, 27 Feb 2025 14:45:01 +0100
> 
> Vincent Foley <vfoley <at> gmail.com> writes:
> 
> > I applied this patch to my emacs-30.1 source tree and I can confirm that
> > it fixes the issue. Thank you for addressing this so quickly!
> 
> Great, thanks for confirming.
> 
> Eli, is this fix OK for the emacs-30 branch or should it go to master?

It should go to emacs-30, since completion-preview was introduced in
Emacs 30.1.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#76606; Package emacs. (Thu, 27 Feb 2025 14:43:03 GMT) Full text and rfc822 format available.

Message #29 received at 76606 <at> debbugs.gnu.org (full text, mbox):

From: Eshel Yaron <me <at> eshelyaron.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: vfoley <at> gmail.com, 76606 <at> debbugs.gnu.org
Subject: Re: bug#76606: 30.1; Conflict between completion-preview and yasnippet
Date: Thu, 27 Feb 2025 15:41:24 +0100
close 76606 30.2
quit

Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: Eshel Yaron <me <at> eshelyaron.com>
>> Cc: 76606 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>
>> Date: Thu, 27 Feb 2025 14:45:01 +0100
>> 
>> Vincent Foley <vfoley <at> gmail.com> writes:
>> 
>> > I applied this patch to my emacs-30.1 source tree and I can confirm that
>> > it fixes the issue. Thank you for addressing this so quickly!
>> 
>> Great, thanks for confirming.
>> 
>> Eli, is this fix OK for the emacs-30 branch or should it go to master?
>
> It should go to emacs-30, since completion-preview was introduced in
> Emacs 30.1.

Thanks, done in commit 840c6824589.  I'm therefore closing this bug.




bug marked as fixed in version 30.2, send any further explanations to 76606 <at> debbugs.gnu.org and Vincent Foley <vfoley <at> gmail.com> Request was from Eshel Yaron <me <at> eshelyaron.com> to control <at> debbugs.gnu.org. (Thu, 27 Feb 2025 14:43:04 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 28 Mar 2025 11:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 79 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.