Subject: bug#39680: closed (Re: bug#39680: 27.0.60; electric-pair-mode broken by undo)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 12 Mar 2020 14:05:01 +0000

Your bug report

#39680: 27.0.60; electric-pair-mode broken by undo

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
39680: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=39680
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#39680: 27.0.60; electric-pair-mode broken by undo
From: Stefan Monnier <[email-masked]>
To: Eli Zaretskii <[email-masked]>
Cc: [email-masked], [email-masked], [email-masked]
Date: Thu, 12 Mar 2020 10:04:11 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

>> Eli, is the patch below OK for `emacs-27`?
> Yes, thanks.

Thanks, installed,

        Stefan

Subject: 27.0.60; electric-pair-mode broken by undo
From: Kévin Le Gouguec <[email-masked]>
To: [email-masked]
Cc: Stefan Monnier <[email-masked]>
Date: Wed, 19 Feb 2020 19:34:37 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello,

Commit e66d5a1c45 (2019-02-19T00:00:[email-masked]) might
have introduced a bug.  From emacs -Q:

1. C-x b foo RET
2. M-x electric-pair-mode RET
3. (
    - A closing parenthesis has been inserted.
4. C-b C-f
    - This is to break undo grouping.
5. a
6. C-_
7. (

In Emacs 26.3, buffer foo contains "(())" and point is after the
innermost opening bracket.

In Emacs 27, buffer foo contains "()" and point is after the closing
bracket.  The *Messages* buffer shows:

> cancel-change-group: Undoing to some unrelated state

NB: this can be reproduced with other electric-pair characters, e.g. ".
I found the bug in a Python buffer trying to write a tuple of strings: I
opened a parenthesis, forgot to add quotes, wrote a string, hit undo,
tried to insert a single quote… and got moved past the end parenthesis
instead.

I tried to write a non-regression test; unfortunately what I came up
with does not catch this bug reliably:

(ert-deftest electric-pair-undo-unrelated-state ()
  (with-temp-buffer
    (buffer-enable-undo)
    (electric-pair-mode)
    (let ((last-command-event ?\())
      (self-insert-command 1))
    (undo-boundary)
    (insert "hi there")
    (undo)
    (let ((last-command-event ?\())
      (self-insert-command 1))))

C-x C-e'ing the (with-temp-buffer …) form only triggers the error once
every two evaluations, for some reason.

Thank you for your time.

In GNU Emacs 28.0.50 (build 5, x86_64-pc-linux-gnu, GTK+ Version 3.24.13, cairo version 1.16.0)
 of 2020-02-19 built on my-little-tumbleweed
Repository revision: e1e1bd8f85c53fea9f61b6ec99b461ddd93461b9
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12007000
System Description: openSUSE Tumbleweed

Configured using:
 'configure --with-xwidgets --with-cairo'