GNU bug report logs - #72437
Unexpected behavior when inserting with prefix arg in electric-pair-mode

Previous Next

Package: emacs;

Reported by: Joseph Turner <joseph <at> breatheoutbreathe.in>

Date: Sat, 3 Aug 2024 07:14:02 UTC

Severity: normal

Fixed in version 31.1

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 72437 in the body.
You can then email your comments to 72437 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 eliz <at> gnu.org, bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 07:14:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Joseph Turner <joseph <at> breatheoutbreathe.in>:
New bug report received and forwarded. Copy sent to eliz <at> gnu.org, bug-gnu-emacs <at> gnu.org. (Sat, 03 Aug 2024 07:14:02 GMT) Full text and rfc822 format available.

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

From: Joseph Turner <joseph <at> breatheoutbreathe.in>
To: bug-gnu-emacs <at> gnu.org
Subject: Unexpected behavior when inserting with prefix arg in
 electric-pair-mode
Date: Sat, 03 Aug 2024 00:12:33 -0700
Migrated from this thread on the devel mailing list:

https://yhetil.org/emacs-devel/86ikwiumza.fsf <at> gnu.org/T/#t


On Emacs 29.4, with emacs -Q

Turn on electric-pair-mode

(electric-pair-mode +1)

Then press "C-2 ("

Expected result:

Either (()) or ()()

Actual result:

(()


I noticed the unexpected behavior when attempting to surround some text
with multiple braces in order to create Anki flashcards.

More or less, I wanted to go from "foo" to "{{foo}}", and I thought
perhaps that with the whole word selected, pressing "C-2 {" would DTRT.

In general, I'm not sure whether "{}{}" or "{{}}"is more useful or
expected, but I suspect both are better than "{{}".

Thank you!

Joseph




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 09:13:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Joseph Turner <joseph <at> breatheoutbreathe.in>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 72437 <at> debbugs.gnu.org
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in
 electric-pair-mode
Date: Sat, 03 Aug 2024 12:12:06 +0300
> Cc: eliz <at> gnu.org
> From: Joseph Turner <joseph <at> breatheoutbreathe.in>
> Date: Sat, 03 Aug 2024 00:12:33 -0700
> 
> Migrated from this thread on the devel mailing list:
> 
> https://yhetil.org/emacs-devel/86ikwiumza.fsf <at> gnu.org/T/#t
> 
> 
> On Emacs 29.4, with emacs -Q
> 
> Turn on electric-pair-mode
> 
> (electric-pair-mode +1)
> 
> Then press "C-2 ("
> 
> Expected result:
> 
> Either (()) or ()()
> 
> Actual result:
> 
> (()
> 
> 
> I noticed the unexpected behavior when attempting to surround some text
> with multiple braces in order to create Anki flashcards.
> 
> More or less, I wanted to go from "foo" to "{{foo}}", and I thought
> perhaps that with the whole word selected, pressing "C-2 {" would DTRT.
> 
> In general, I'm not sure whether "{}{}" or "{{}}"is more useful or
> expected, but I suspect both are better than "{{}".

Making it produce "{}{}" is relatively easy: we just need to call the
post-self-insert-hook for each of the ARG inserted characters.  OTOH,
to produce "{{}}" we'd probably need to rewrite the
electric-pair-mode's hook function, but I have no idea how to rewrite
it to do that.

Stefan, any suggestions?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 11:06:01 GMT) Full text and rfc822 format available.

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

From: Eshel Yaron <me <at> eshelyaron.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, Stefan Monnier <monnier <at> iro.umontreal.ca>,
 Joseph Turner <joseph <at> breatheoutbreathe.in>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 03 Aug 2024 13:04:58 +0200
Eli Zaretskii <eliz <at> gnu.org> writes:

>> Cc: eliz <at> gnu.org
>> From: Joseph Turner <joseph <at> breatheoutbreathe.in>
>> Date: Sat, 03 Aug 2024 00:12:33 -0700
>> 
>> Migrated from this thread on the devel mailing list:
>> 
>> https://yhetil.org/emacs-devel/86ikwiumza.fsf <at> gnu.org/T/#t
>> 
>> 
>> On Emacs 29.4, with emacs -Q
>> 
>> Turn on electric-pair-mode
>> 
>> (electric-pair-mode +1)
>> 
>> Then press "C-2 ("
>> 
>> Expected result:
>> 
>> Either (()) or ()()
>> 
>> Actual result:
>> 
>> (()
>> 
>> 
>> I noticed the unexpected behavior when attempting to surround some text
>> with multiple braces in order to create Anki flashcards.
>> 
>> More or less, I wanted to go from "foo" to "{{foo}}", and I thought
>> perhaps that with the whole word selected, pressing "C-2 {" would DTRT.
>> 
>> In general, I'm not sure whether "{}{}" or "{{}}"is more useful or
>> expected, but I suspect both are better than "{{}".
>
> Making it produce "{}{}" is relatively easy: we just need to call the
> post-self-insert-hook for each of the ARG inserted characters.  OTOH,
> to produce "{{}}" we'd probably need to rewrite the
> electric-pair-mode's hook function, but I have no idea how to rewrite
> it to do that.
>
> Stefan, any suggestions?

I'm no Stefan, but I took a quick stab at it.  The following diff
teaches electric-pair-mode about numeric prefix arguments:

diff --git a/lisp/elec-pair.el b/lisp/elec-pair.el
index 40618e9ef38..1fae0ba6ba4 100644
--- a/lisp/elec-pair.el
+++ b/lisp/elec-pair.el
@@ -260,7 +260,7 @@ electric-pair-syntax-info
                (list ?\( (cdr direct) t string-or-comment)))
      (reverse (list ?\) (car reverse) t string-or-comment)))))
 
-(defun electric-pair--insert (char)
+(defun electric-pair--insert (char times)
   (let ((last-command-event char)
 	(blink-matching-paren nil)
 	(electric-pair-mode nil)
@@ -271,7 +271,7 @@ electric-pair--insert
         ;; us to add these newlines, and is probably about to kick in
         ;; again after we add the closer.
         (electric-layout-allow-duplicate-newlines t))
-    (self-insert-command 1)))
+    (self-insert-command times)))
 
 (defun electric-pair--syntax-ppss (&optional pos where)
   "Like `syntax-ppss', but sometimes fallback to `parse-partial-sexp'.
@@ -455,7 +455,8 @@ electric-pair-inhibit-if-helps-balance
        (atomic-change-group
          ;; Don't use `delete-char'; that may modify the head of the
          ;; undo list.
-         (delete-region (point) (1- (point)))
+         (delete-region (- (point) (prefix-numeric-value current-prefix-arg))
+                        (point))
          (throw
           'done
           (cond ((eq ?\( syntax)
@@ -474,25 +475,26 @@ electric-pair-skip-if-helps-balance
 Works by first removing the character from the buffer, then doing
 some list calculations, finally restoring the situation as if nothing
 happened."
-  (pcase (electric-pair-syntax-info char)
-    (`(,syntax ,pair ,_ ,s-or-c)
-     (unwind-protect
-         (progn
-           (delete-char -1)
-           (cond ((eq syntax ?\))
-                  (let* ((pair-data
-                          (electric-pair--balance-info
-                           -1 s-or-c))
-                         (innermost (car pair-data))
-                         (outermost (cdr pair-data)))
-                    (and
-                     (cond ((car outermost)
-                            (car innermost))
-                           ((car innermost)
-                            (not (eq (cdr outermost) pair)))))))
-                 ((eq syntax ?\")
-                  (electric-pair--inside-string-p char))))
-       (insert char)))))
+  (let ((num (prefix-numeric-value current-prefix-arg)))
+    (pcase (electric-pair-syntax-info char)
+      (`(,syntax ,pair ,_ ,s-or-c)
+       (unwind-protect
+           (progn
+             (delete-char (- num))
+             (cond ((eq syntax ?\))
+                    (let* ((pair-data
+                            (electric-pair--balance-info
+                             (- num) s-or-c))
+                           (innermost (car pair-data))
+                           (outermost (cdr pair-data)))
+                      (and
+                       (cond ((car outermost)
+                              (car innermost))
+                             ((car innermost)
+                              (not (eq (cdr outermost) pair)))))))
+                   ((eq syntax ?\")
+                    (electric-pair--inside-string-p char))))
+         (insert (make-string num char)))))))
 
 (defun electric-pair-default-skip-self (char)
   (if electric-pair-preserve-balance
@@ -527,11 +529,14 @@ electric-pair-post-self-insert-function
  `electric-pair-inhibit-predicate', `electric-pair-skip-self'
   and `electric-pair-skip-whitespace' (which see)."
   (let* ((pos (and electric-pair-mode (electric--after-char-pos)))
+         (num (when pos (prefix-numeric-value current-prefix-arg)))
+         (beg (when num (- pos num)))
          (skip-whitespace-info))
     (pcase (electric-pair-syntax-info last-command-event)
       (`(,syntax ,pair ,unconditional ,_)
        (cond
         ((null pos) nil)
+        ((zerop num) nil)
         ;; Wrap a pair around the active region.
         ;;
         ((and (memq syntax '(?\( ?\) ?\" ?\$)) (use-region-p))
@@ -545,23 +550,24 @@ electric-pair-post-self-insert-function
                       (>= (mark) (point))))
              (save-excursion
                (goto-char (mark))
-               (electric-pair--insert pair))
-           (delete-region pos (1- pos))
-           (electric-pair--insert pair)
+               (electric-pair--insert pair num))
+           (delete-region beg pos)
+           (electric-pair--insert pair num)
            (goto-char (mark))
-           (electric-pair--insert last-command-event)))
+           (electric-pair--insert last-command-event num)))
         ;; Backslash-escaped: no pairing, no skipping.
         ((save-excursion
-           (goto-char (1- pos))
+           (goto-char beg)
            (not (zerop (% (skip-syntax-backward "\\") 2))))
-         nil)
+         (let ((current-prefix-arg (1- num)))
+           (electric-pair-post-self-insert-function)))
         ;; Skip self.
         ((and (memq syntax '(?\) ?\" ?\$))
               (and (or unconditional
                        (if (functionp electric-pair-skip-self)
                            (electric-pair--save-literal-point-excursion
-                             (goto-char pos)
-                             (funcall electric-pair-skip-self last-command-event))
+                            (goto-char pos)
+                            (funcall electric-pair-skip-self last-command-event))
                          electric-pair-skip-self))
                    (save-excursion
                      (when (and (not (and unconditional
@@ -580,19 +586,19 @@ electric-pair-post-self-insert-function
          ;; live with it for now.
          (when skip-whitespace-info
            (funcall electric-pair-skip-whitespace-function))
-         (delete-region (1- pos) (if (eq skip-whitespace-info 'chomp)
-                                     (point)
-                                   pos))
-         (forward-char))
+         (delete-region beg (if (eq skip-whitespace-info 'chomp)
+                                (point)
+                              pos))
+         (forward-char num))
         ;; Insert matching pair.
         ((and (memq syntax '(?\( ?\" ?\$))
               (not overwrite-mode)
               (or unconditional
                   (not (electric-pair--save-literal-point-excursion
-                         (goto-char pos)
-                         (funcall electric-pair-inhibit-predicate
-                                  last-command-event)))))
-         (save-excursion (electric-pair--insert pair))))))))
+                        (goto-char pos)
+                        (funcall electric-pair-inhibit-predicate
+                                 last-command-event)))))
+         (save-excursion (electric-pair--insert pair num))))))))
 
 (defun electric-pair-open-newline-between-pairs-psif ()
   "Honor `electric-pair-open-newline-between-pairs'.
@@ -604,7 +610,8 @@ electric-pair-open-newline-between-pairs-psif
              (< (1+ (point-min)) (point) (point-max))
              (eq (save-excursion
                    (skip-chars-backward "\t\s")
-                   (char-before (1- (point))))
+                   (char-before (- (point)
+                                   (prefix-numeric-value current-prefix-arg))))
                  (matching-paren (char-after))))
     (save-excursion (newline 1 t))))
 
@@ -618,7 +625,7 @@ electric-pair-delete-pair
 ARG and KILLP are passed directly to
 `backward-delete-char-untabify', which see."
   (interactive "*p\nP")
-  (delete-char 1)
+  (delete-char arg)
   (backward-delete-char-untabify arg killp))
 
 (defvar electric-pair-mode-map





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 15:42:01 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, monnier <at> iro.umontreal.ca,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 03 Aug 2024 18:40:37 +0300
> From: Eshel Yaron <me <at> eshelyaron.com>
> Cc: Joseph Turner <joseph <at> breatheoutbreathe.in>,  Stefan Monnier
>  <monnier <at> iro.umontreal.ca>,  72437 <at> debbugs.gnu.org
> Date: Sat, 03 Aug 2024 13:04:58 +0200
> 
> Eli Zaretskii <eliz <at> gnu.org> writes:
> 
> > post-self-insert-hook for each of the ARG inserted characters.  OTOH,
> > to produce "{{}}" we'd probably need to rewrite the
> > electric-pair-mode's hook function, but I have no idea how to rewrite
> > it to do that.
> >
> > Stefan, any suggestions?
> 
> I'm no Stefan, but I took a quick stab at it.  The following diff
> teaches electric-pair-mode about numeric prefix arguments:

Thanks, but isn't it cleaner if we simply call the hook from cmds.c
the same number of times as we insert a character?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 18:19:01 GMT) Full text and rfc822 format available.

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

From: Eshel Yaron <me <at> eshelyaron.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, monnier <at> iro.umontreal.ca,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 03 Aug 2024 20:18:06 +0200
Hi Eli,

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

>> From: Eshel Yaron <me <at> eshelyaron.com>
>> Cc: Joseph Turner <joseph <at> breatheoutbreathe.in>,  Stefan Monnier
>>  <monnier <at> iro.umontreal.ca>,  72437 <at> debbugs.gnu.org
>> Date: Sat, 03 Aug 2024 13:04:58 +0200
>> 
>> Eli Zaretskii <eliz <at> gnu.org> writes:
>> 
>> > post-self-insert-hook for each of the ARG inserted characters.  OTOH,
>> > to produce "{{}}" we'd probably need to rewrite the
>> > electric-pair-mode's hook function, but I have no idea how to rewrite
>> > it to do that.
>> >
>> > Stefan, any suggestions?
>> 
>> I'm no Stefan, but I took a quick stab at it.  The following diff
>> teaches electric-pair-mode about numeric prefix arguments:
>
> Thanks, but isn't it cleaner if we simply call the hook from cmds.c
> the same number of times as we insert a character?

Interesting, it might work for electric-pair-mode, though I suspect that
not all functions that people put on post-self-insert-hook are prepared
to be invoked repeatedly following a single self-insert-command.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 03 Aug 2024 18:47:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, monnier <at> iro.umontreal.ca,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 03 Aug 2024 21:46:22 +0300
> From: Eshel Yaron <me <at> eshelyaron.com>
> Cc: joseph <at> breatheoutbreathe.in,  monnier <at> iro.umontreal.ca,
>   72437 <at> debbugs.gnu.org
> Date: Sat, 03 Aug 2024 20:18:06 +0200
> 
> >> I'm no Stefan, but I took a quick stab at it.  The following diff
> >> teaches electric-pair-mode about numeric prefix arguments:
> >
> > Thanks, but isn't it cleaner if we simply call the hook from cmds.c
> > the same number of times as we insert a character?
> 
> Interesting, it might work for electric-pair-mode, though I suspect that
> not all functions that people put on post-self-insert-hook are prepared
> to be invoked repeatedly following a single self-insert-command.

It isn't a single self-insert-command, since it inserts N characters.
So it is natural to expect the hook to be invoked those same N times.
I think.  Let's hear what Stefan thinks (and anyone else who has an
opinion or some case other than electric-pair-mode).




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Wed, 14 Aug 2024 00:59:01 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: João Távora <joaotavora <at> gmail.com>
Cc: 72437 <at> debbugs.gnu.org, Joseph Turner <joseph <at> breatheoutbreathe.in>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Tue, 13 Aug 2024 20:57:44 -0400
Hi João,

Do you have a good idea of how to make

   C-M-SPC C-2 {

wrap the selected word within two braces?


        Stefan


Eli Zaretskii [2024-08-03 12:12:06] wrote:

>> Cc: eliz <at> gnu.org
>> From: Joseph Turner <joseph <at> breatheoutbreathe.in>
>> Date: Sat, 03 Aug 2024 00:12:33 -0700
>> 
>> Migrated from this thread on the devel mailing list:
>> 
>> https://yhetil.org/emacs-devel/86ikwiumza.fsf <at> gnu.org/T/#t
>> 
>> 
>> On Emacs 29.4, with emacs -Q
>> 
>> Turn on electric-pair-mode
>> 
>> (electric-pair-mode +1)
>> 
>> Then press "C-2 ("
>> 
>> Expected result:
>> 
>> Either (()) or ()()
>> 
>> Actual result:
>> 
>> (()
>> 
>> 
>> I noticed the unexpected behavior when attempting to surround some text
>> with multiple braces in order to create Anki flashcards.
>> 
>> More or less, I wanted to go from "foo" to "{{foo}}", and I thought
>> perhaps that with the whole word selected, pressing "C-2 {" would DTRT.
>> 
>> In general, I'm not sure whether "{}{}" or "{{}}"is more useful or
>> expected, but I suspect both are better than "{{}".
>
> Making it produce "{}{}" is relatively easy: we just need to call the
> post-self-insert-hook for each of the ARG inserted characters.  OTOH,
> to produce "{{}}" we'd probably need to rewrite the
> electric-pair-mode's hook function, but I have no idea how to rewrite
> it to do that.
>
> Stefan, any suggestions?





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Wed, 14 Aug 2024 01:02:02 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, Eshel Yaron <me <at> eshelyaron.com>,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Tue, 13 Aug 2024 21:00:19 -0400
> It isn't a single self-insert-command, since it inserts N characters.
> So it is natural to expect the hook to be invoked those same N times.
> I think.  Let's hear what Stefan thinks (and anyone else who has an
> opinion or some case other than electric-pair-mode).

I think the requested behavior makes a lot of sense, but I lost touch
with the way elec-pair works and interacts with other electric modes, so
I'm not sure how to make it work without breaking other things.


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Wed, 14 Aug 2024 05:09:02 GMT) Full text and rfc822 format available.

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

From: Eshel Yaron <me <at> eshelyaron.com>
To: Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of
 text editors" <bug-gnu-emacs <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>, joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Wed, 14 Aug 2024 07:07:23 +0200
Hi Stefan,

Stefan Monnier writes:

>> Let's hear what Stefan thinks (and anyone else who has an
>> opinion or some case other than electric-pair-mode).
>
> I think the requested behavior makes a lot of sense, but I lost touch
> with the way elec-pair works and interacts with other electric modes, so
> I'm not sure how to make it work without breaking other things.

In case you missed it, the patch I shared upthread might give you
some ideas.  It implements the requested behavior, safely, I think.
So I would just ask Joseph to try it out for a while and see if it
works as expected and if any other issues crop up :)


Cheers,

Eshel




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Wed, 14 Aug 2024 05:09:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Wed, 14 Aug 2024 11:41:01 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Wed, 14 Aug 2024 07:39:27 -0400
> In case you missed it, the patch I shared upthread might give you
> some ideas.  It implements the requested behavior, safely, I think.
> So I would just ask Joseph to try it out for a while and see if it
> works as expected and if any other issues crop up :)

I missed that, indeed, sorry.  Then maybe we should just push it to
`master` (with appropriate regression test(s)).


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Fri, 16 Aug 2024 21:25:02 GMT) Full text and rfc822 format available.

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

From: João Távora <joaotavora <at> gmail.com>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 72437 <at> debbugs.gnu.org, Joseph Turner <joseph <at> breatheoutbreathe.in>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in
 electric-pair-mode
Date: Fri, 16 Aug 2024 22:22:29 +0100
[Message part 1 (text/plain, inline)]
On Wed, Aug 14, 2024, 01:57 Stefan Monnier <monnier <at> iro.umontreal.ca> wrote:

> Hi João,
>
> Do you have a good idea of how to make
>
>    C-M-SPC C-2 {
>
> wrap the selected word within two braces?
>

No great ideas no. Does it even work in the non-wrapping case? The intended
result is as if the command was run twice, no? So maybe try somehow that
the whole thing is run twice/thrice/etc...

João
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 06:10:02 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: João Távora <joaotavora <at> gmail.com>
Cc: 72437 <at> debbugs.gnu.org, monnier <at> iro.umontreal.ca,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in
 electric-pair-mode
Date: Sat, 17 Aug 2024 09:08:50 +0300
> Cc: 72437 <at> debbugs.gnu.org, Joseph Turner <joseph <at> breatheoutbreathe.in>
> From: João Távora <joaotavora <at> gmail.com>
> Date: Fri, 16 Aug 2024 22:22:29 +0100
> 
> On Wed, Aug 14, 2024, 01:57 Stefan Monnier <monnier <at> iro.umontreal.ca> wrote:
> 
>  Hi João,
> 
>  Do you have a good idea of how to make
> 
>     C-M-SPC C-2 {
> 
>  wrap the selected word within two braces?
> 
> No great ideas no. Does it even work in the non-wrapping case? The intended result is as if the command was
> run twice, no? So maybe try somehow that the whole thing is run twice/thrice/etc...

That's what I suggested, but the result is "{}{}{}{}...", which is not
what was requested.  IOW, what is being requested is NOT what happens
when running this command N times, it should be a special handling of
the numerical argument.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 06:30:02 GMT) Full text and rfc822 format available.

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

From: Joseph Turner <joseph <at> breatheoutbreathe.in>
To: Eshel Yaron <me <at> eshelyaron.com>,
 "Stefan Monnier via Bug reports for GNU Emacs,
 the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in electric-pair-mode
Date: Fri, 16 Aug 2024 23:28:32 -0700

On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>Hi Stefan,
>
>Stefan Monnier writes:
>
>>> Let's hear what Stefan thinks (and anyone else who has an
>>> opinion or some case other than electric-pair-mode).
>>
>> I think the requested behavior makes a lot of sense, but I lost touch
>> with the way elec-pair works and interacts with other electric modes, so
>> I'm not sure how to make it work without breaking other things.
>
>In case you missed it, the patch I shared upthread might give you
>some ideas.  It implements the requested behavior, safely, I think.
>So I would just ask Joseph to try it out for a while and see if it
>works as expected and if any other issues crop up :)

Thanks for this patch!  I am testing it in my daily config.  So far so good, and I'll report back after a few weeks of usage.

Warmly,

Joseph




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 06:32:01 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 09:33:01 GMT) Full text and rfc822 format available.

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

From: João Távora <joaotavora <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org, monnier <at> iro.umontreal.ca,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in
 electric-pair-mode
Date: Sat, 17 Aug 2024 10:30:18 +0100
On Sat, Aug 17, 2024 at 7:08 AM Eli Zaretskii <eliz <at> gnu.org> wrote:

> That's what I suggested, but the result is "{}{}{}{}...", which is not
> what was requested.

If the preconditions are that a word is selected before each command,
I don't see how that can be.  At the very least it would be {word}{}{}{}
or something like that.  But if you arrange for word to stay selected and
point before it, I don't see why {{{{word}}}} can't be achieved.  Doesn't
have to be word at all, could be an arbitrary sexp, IIRC. Anyway,
that's all I have.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 14:05:02 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 72437 <at> debbugs.gnu.org,
 João Távora <joaotavora <at> gmail.com>,
 joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 17 Aug 2024 10:03:38 -0400
> That's what I suggested, but the result is "{}{}{}{}...", which is not

For me `C-u 2 (` results in `(()`.


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 17 Aug 2024 14:23:01 GMT) Full text and rfc822 format available.

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

From: Eli Zaretskii <eliz <at> gnu.org>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 72437 <at> debbugs.gnu.org, joaotavora <at> gmail.com, joseph <at> breatheoutbreathe.in
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 17 Aug 2024 17:21:07 +0300
> From: Stefan Monnier <monnier <at> iro.umontreal.ca>
> Cc: João Távora <joaotavora <at> gmail.com>,
>   72437 <at> debbugs.gnu.org,
>   joseph <at> breatheoutbreathe.in
> Date: Sat, 17 Aug 2024 10:03:38 -0400
> 
> > That's what I suggested, but the result is "{}{}{}{}...", which is not
> 
> For me `C-u 2 (` results in `(()`.

I suggested a change which would yield ()().  Without the change, you
shouldn't expect getting anything useful, because the hook is called
just once, not ARG times.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Thu, 19 Sep 2024 05:16:02 GMT) Full text and rfc822 format available.

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

From: Joseph Turner <joseph <at> breatheoutbreathe.in>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, "Stefan Monnier via Bug reports for GNU Emacs,
 the Swiss army knife of
 text editors" <bug-gnu-emacs <at> gnu.org>, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Wed, 18 Sep 2024 22:14:48 -0700
Joseph Turner <joseph <at> breatheoutbreathe.in> writes:

> On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>>Hi Stefan,
>>
>>Stefan Monnier writes:
>>
>>>> Let's hear what Stefan thinks (and anyone else who has an
>>>> opinion or some case other than electric-pair-mode).
>>>
>>> I think the requested behavior makes a lot of sense, but I lost touch
>>> with the way elec-pair works and interacts with other electric modes, so
>>> I'm not sure how to make it work without breaking other things.
>>
>>In case you missed it, the patch I shared upthread might give you
>>some ideas.  It implements the requested behavior, safely, I think.
>>So I would just ask Joseph to try it out for a while and see if it
>>works as expected and if any other issues crop up :)
>
> Thanks for this patch!  I am testing it in my daily config.  So far so good, and I'll report back after a few weeks of usage.

I have been running this patch for over a month with no issue.  I vote
to merge it!

Thank you!

Joseph




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Thu, 19 Sep 2024 05:16:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 21 Sep 2024 10:25:02 GMT) Full text and rfc822 format available.

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

From: Eshel Yaron <me <at> eshelyaron.com>
To: Joseph Turner <joseph <at> breatheoutbreathe.in>
Cc: 72437 <at> debbugs.gnu.org, "Stefan Monnier via Bug reports for GNU Emacs,
 the Swiss army knife of
 text editors" <bug-gnu-emacs <at> gnu.org>, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 21 Sep 2024 12:23:55 +0200
[Message part 1 (text/plain, inline)]
Joseph Turner <joseph <at> breatheoutbreathe.in> writes:

> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>
>> On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>>>Hi Stefan,
>>>
>>>Stefan Monnier writes:
>>>
>>>>> Let's hear what Stefan thinks (and anyone else who has an
>>>>> opinion or some case other than electric-pair-mode).
>>>>
>>>> I think the requested behavior makes a lot of sense, but I lost touch
>>>> with the way elec-pair works and interacts with other electric modes, so
>>>> I'm not sure how to make it work without breaking other things.
>>>
>>>In case you missed it, the patch I shared upthread might give you
>>>some ideas.  It implements the requested behavior, safely, I think.
>>>So I would just ask Joseph to try it out for a while and see if it
>>>works as expected and if any other issues crop up :)
>>
>> Thanks for this patch!  I am testing it in my daily config.  So far
>> so good, and I'll report back after a few weeks of usage.
>
> I have been running this patch for over a month with no issue.

That's great, thanks for testing it and for reporting back!

> I vote to merge it!

Agreed.  Here's a full patch with tests, doc updates and a NEWS entry:

[0001-Teach-Electric-Pair-mode-about-prefix-arguments.patch (text/x-patch, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 21 Sep 2024 10:25:06 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 21 Sep 2024 17:26:02 GMT) Full text and rfc822 format available.

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

From: Joseph Turner <joseph <at> breatheoutbreathe.in>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, "Stefan Monnier via Bug reports for GNU Emacs,
 the Swiss army knife of
 text editors" <bug-gnu-emacs <at> gnu.org>, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sat, 21 Sep 2024 10:24:57 -0700
[Message part 1 (text/plain, inline)]
Eshel Yaron <me <at> eshelyaron.com> writes:

> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>
>> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>>
>>> On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>>>>Hi Stefan,
>>>>
>>>>Stefan Monnier writes:
>>>>
>>>>>> Let's hear what Stefan thinks (and anyone else who has an
>>>>>> opinion or some case other than electric-pair-mode).
>>>>>
>>>>> I think the requested behavior makes a lot of sense, but I lost touch
>>>>> with the way elec-pair works and interacts with other electric modes, so
>>>>> I'm not sure how to make it work without breaking other things.
>>>>
>>>>In case you missed it, the patch I shared upthread might give you
>>>>some ideas.  It implements the requested behavior, safely, I think.
>>>>So I would just ask Joseph to try it out for a while and see if it
>>>>works as expected and if any other issues crop up :)
>>>
>>> Thanks for this patch!  I am testing it in my daily config.  So far
>>> so good, and I'll report back after a few weeks of usage.
>>
>> I have been running this patch for over a month with no issue.
>
> That's great, thanks for testing it and for reporting back!
>
>> I vote to merge it!
>
> Agreed.  Here's a full patch with tests, doc updates and a NEWS entry:

Nice!  How about also adding a test like the attached patch?

[0001-Test-behavior-with-prefix-argument.patch (text/x-diff, inline)]
From 414a4b1fa09b0b976e74144430871b1b5a9ddbbe Mon Sep 17 00:00:00 2001
From: Joseph Turner <joseph <at> breatheoutbreathe.in>
Date: Sat, 21 Sep 2024 10:23:07 -0700
Subject: [PATCH] Test behavior with prefix argument

* test/lisp/electric-tests.el (electric-pair-backspace-2)
---
 test/lisp/electric-tests.el | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
index 720313511a6..f1742fe3f0b 100644
--- a/test/lisp/electric-tests.el
+++ b/test/lisp/electric-tests.el
@@ -562,6 +562,14 @@ electric-pair-backspace-1
       (electric-pair-delete-pair 1)
       (should (equal "" (buffer-string))))))
 
+(ert-deftest electric-pair-backspace-2 ()
+  (save-electric-modes
+   (with-temp-buffer
+     (insert "((()))")
+     (goto-char 4)
+     (electric-pair-delete-pair 2)
+     (should (equal "()" (buffer-string))))))
+
 
 ;;; Undoing
 (ert-deftest electric-pair-undo-unrelated-state ()
-- 
2.46.0


Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sat, 21 Sep 2024 17:26:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sun, 22 Sep 2024 08:22:02 GMT) Full text and rfc822 format available.

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

From: Eshel Yaron <me <at> eshelyaron.com>
To: Joseph Turner <joseph <at> breatheoutbreathe.in>
Cc: 72437 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg
 in electric-pair-mode
Date: Sun, 22 Sep 2024 10:21:13 +0200
close 72437 31.1
quit

Joseph Turner <joseph <at> breatheoutbreathe.in> writes:

> Eshel Yaron <me <at> eshelyaron.com> writes:
>
>> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>>
>>> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>>>
>>>> On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>>>>>Hi Stefan,
>>>>>
>>>>>Stefan Monnier writes:
>>>>>
>>>>>>> Let's hear what Stefan thinks (and anyone else who has an
>>>>>>> opinion or some case other than electric-pair-mode).
>>>>>>
>>>>>> I think the requested behavior makes a lot of sense, but I lost touch
>>>>>> with the way elec-pair works and interacts with other electric modes, so
>>>>>> I'm not sure how to make it work without breaking other things.
>>>>>
>>>>>In case you missed it, the patch I shared upthread might give you
>>>>>some ideas.  It implements the requested behavior, safely, I think.
>>>>>So I would just ask Joseph to try it out for a while and see if it
>>>>>works as expected and if any other issues crop up :)
>>>>
>>>> Thanks for this patch!  I am testing it in my daily config.  So far
>>>> so good, and I'll report back after a few weeks of usage.
>>>
>>> I have been running this patch for over a month with no issue.
>>
>> That's great, thanks for testing it and for reporting back!
>>
>>> I vote to merge it!
>>
>> Agreed.  Here's a full patch with tests, doc updates and a NEWS entry:
>
> Nice!  How about also adding a test like the attached patch?

Looks good :)

I've now pushed my patch to master as a7192fd7b73 followed by your test
addition as 0f4c09d2678.  And with that, I'm closing this bug.


Best,

Eshel




bug marked as fixed in version 31.1, send any further explanations to 72437 <at> debbugs.gnu.org and Joseph Turner <joseph <at> breatheoutbreathe.in> Request was from Eshel Yaron <me <at> eshelyaron.com> to control <at> debbugs.gnu.org. (Sun, 22 Sep 2024 08:22:03 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#72437; Package emacs. (Sun, 22 Sep 2024 19:34:02 GMT) Full text and rfc822 format available.

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

From: Joseph Turner <joseph <at> breatheoutbreathe.in>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 72437 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#72437: Unexpected behavior when inserting with prefix arg in electric-pair-mode
Date: Sun, 22 Sep 2024 12:32:37 -0700

On September 22, 2024 1:21:13 AM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>close 72437 31.1
>quit
>
>Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>
>> Eshel Yaron <me <at> eshelyaron.com> writes:
>>
>>> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>>>
>>>> Joseph Turner <joseph <at> breatheoutbreathe.in> writes:
>>>>
>>>>> On August 13, 2024 10:07:23 PM PDT, Eshel Yaron <me <at> eshelyaron.com> wrote:
>>>>>>Hi Stefan,
>>>>>>
>>>>>>Stefan Monnier writes:
>>>>>>
>>>>>>>> Let's hear what Stefan thinks (and anyone else who has an
>>>>>>>> opinion or some case other than electric-pair-mode).
>>>>>>>
>>>>>>> I think the requested behavior makes a lot of sense, but I lost touch
>>>>>>> with the way elec-pair works and interacts with other electric modes, so
>>>>>>> I'm not sure how to make it work without breaking other things.
>>>>>>
>>>>>>In case you missed it, the patch I shared upthread might give you
>>>>>>some ideas.  It implements the requested behavior, safely, I think.
>>>>>>So I would just ask Joseph to try it out for a while and see if it
>>>>>>works as expected and if any other issues crop up :)
>>>>>
>>>>> Thanks for this patch!  I am testing it in my daily config.  So far
>>>>> so good, and I'll report back after a few weeks of usage.
>>>>
>>>> I have been running this patch for over a month with no issue.
>>>
>>> That's great, thanks for testing it and for reporting back!
>>>
>>>> I vote to merge it!
>>>
>>> Agreed.  Here's a full patch with tests, doc updates and a NEWS entry:
>>
>> Nice!  How about also adding a test like the attached patch?
>
>Looks good :)
>
>I've now pushed my patch to master as a7192fd7b73 followed by your test
>addition as 0f4c09d2678.  And with that, I'm closing this bug.

Thank you!!

Joseph




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 21 Oct 2024 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 301 days ago.

Previous Next


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