Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

bug#15126: 24.3; kmacro-end-and-call-macro repeats macro multiple times following isearch-forward

25 views
Skip to first unread message

Simon Katz

unread,
Aug 18, 2013, 5:39:41 PM8/18/13
to 15...@debbugs.gnu.org
If I have a buffer with some text that is repeated several times and
do the following:
  - C-s <some text>  (isearch-forward)   to search for the repeated text
  - C-x (   (kmacro-start-macro)
  - Enter some new text
  - C-s C-s   to search again
  - C-x e  (kmacro-end-and-call-macro)
I get different behaviour in my old and new versions of Emacs.

In Emacs 24.2.1 and all previous versions I've used,
kmacro-end-and-call-macro calls the macro once more, and I can go
through the file making changes one at a time, and I can stop when I
want.

In Emacs 24.3.1, kmacro-end-and-call-macro calls the macro repeatedly
making changes to all the repeated text up to the end of the file.

Interestingly, if I define a similar keyboard macro that uses
next-error rather than isearch-forward I get my changes one at a time.

Is this some bizarre new behaviour for isearch-forward? Can I get the
old behaviour back?

Here's a precise recipe:

  /Applications/Emacs-24-3-1.app/Contents/MacOS/Emacs -Q

  Then at the start of the *scratch* buffer:

  C-s   e r   C-x (   x x x x   C-s C-s   C-x e

  Emacs makes multiple changes for the  C-x e.





In GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
 of 2013-03-13 on bob.porkrind.org
Windowing system distributor `Apple', version 10.3.1138
Configured using:
 `configure '--host=x86_64-apple-darwin' '--build=i686-apple-darwin'
 '--with-ns' 'build_alias=i686-apple-darwin'
 'host_alias=x86_64-apple-darwin' 'CC=gcc -mmacosx-version-min=10.7
 -isystem
 /Users/david/Xcode-10.7_4.5.2/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/usr/include/
 -F/Users/david/Xcode-10.7_4.5.2/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks''

Important settings:
  value of $LANG: en_GB.UTF-8
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-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
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
s-x M-x r e p <tab> o r t <tab> <return>

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
kill-region: The mark is not set now, so there is no region
Making completion list...

Load-path shadows:
None found.

Features:
(shadow sort gnus-util mail-extr emacsbug message format-spec rfc822 mml
mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util
mail-prsvr mail-utils help-mode easymenu time-date tooltip ediff-hook
vc-hooks lisp-float-type mwheel ns-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list newcomment lisp-mode register page
menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core frame cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote make-network-process ns multi-tty emacs)

Drew Adams

unread,
Aug 18, 2013, 10:26:03 PM8/18/13
to Simon Katz, 15...@debbugs.gnu.org
> Here's a precise recipe:
>   /Applications/Emacs-24-3-1.app/Contents/MacOS/Emacs -Q
>   Then at the start of the *scratch* buffer:
>   C-s   e r   C-x (   x x x x   C-s C-s   C-x e
>   Emacs makes multiple changes for the  C-x e.

Confirmed in MS Windows builds.
Emacs 23.4 through Emacs 24.2 were OK.
Emacs 24.3 introduced the regression.



nomi...@gmail.com

unread,
Aug 19, 2013, 2:34:54 AM8/19/13
to
On Sunday, 18 August 2013 22:39:41 UTC+1, Simon Katz wrote:
>
> Here's a precise recipe:
>
>
>   /Applications/Emacs-24-3-1.app/Contents/MacOS/Emacs -Q
>
>
>
>   Then at the start of the *scratch* buffer:
>
>
>   C-s   e r   C-x (   x x x x   C-s C-s   C-x e
>
>
>   Emacs makes multiple changes for the  C-x e.

Some more detail:

/Applications/Emacs-24-3-1.app/Contents/MacOS/Emacs -Q
Then at the start of the *scratch* buffer:
C-s   e r   C-x (   x x x x   C-s C-s   C-x ) F4 F4
This is as it should be -- one at a time.

But:
/Applications/Emacs-24-3-1.app/Contents/MacOS/Emacs -Q
Then at the start of the *scratch* buffer:
C-s   e r   C-x (   x x x x   C-s C-s   C-x e
(The original report -- multiple changes for the line above.)
Return to the start of the buffer.
F4
Multiple changes are made.

So F4 is ok in the first case but not in the second.

Simon Katz

unread,
Aug 19, 2013, 4:04:38 AM8/19/13
to 15...@debbugs.gnu.org

Juri Linkov

unread,
Aug 19, 2013, 7:50:56 PM8/19/13
to Simon Katz, 15...@debbugs.gnu.org
> In Emacs 24.2.1 and all previous versions I've used,
> kmacro-end-and-call-macro calls the macro once more, and I can go
> through the file making changes one at a time, and I can stop when I
> want.
>
> In Emacs 24.3.1, kmacro-end-and-call-macro calls the macro repeatedly
> making changes to all the repeated text up to the end of the file.

I can't find a change that caused this regression.
At least, I see that it is not caused by the fix for bug#4894
that added `store-kbd-macro-event' to `isearch-other-meta-char'.
But removing `store-kbd-macro-event' from `isearch-unread'
that is called from `isearch-other-meta-char' fixes this bug.
Perhaps this is a wrong fix and I don't know how to fix this properly.
`isearch-other-meta-char' currently is full of crap that should be
rewritten and reduced to a more manageable size.



Juri Linkov

unread,
Aug 24, 2013, 5:45:01 AM8/24/13
to Simon Katz, 15...@debbugs.gnu.org
> In Emacs 24.2.1 and all previous versions I've used,
> kmacro-end-and-call-macro calls the macro once more, and I can go
> through the file making changes one at a time, and I can stop when I
> want.
>
> In Emacs 24.3.1, kmacro-end-and-call-macro calls the macro repeatedly
> making changes to all the repeated text up to the end of the file.

Actually this is an old bug uncovered by another unrelated change.
Emacs 24.2.1 stored the key `C-x' in the keyboard macro.
Emacs 24.3.1 now stores the whole key sequence `C-x e'.

Storing `C-x' had no effect, but also made no sense.
It's clear that neither `C-x' nor `C-x e' should be stored.
So not storing `C-x e' will not execute the same macro repeatedly.

Currently I see only one way to fix this properly:

=== modified file 'lisp/isearch.el'
--- lisp/isearch.el 2013-08-08 23:59:14 +0000
+++ lisp/isearch.el 2013-08-24 09:27:30 +0000
@@ -2386,6 +2386,13 @@ (defun isearch-other-meta-char (&optiona
(isearch-unread-key-sequence keylist)
(setq main-event (car unread-command-events))

+ ;; Don't store special commands in the keyboard macro.
+ (let (overriding-terminal-local-map)
+ (when (memq (key-binding key)
+ '(kmacro-start-macro
+ kmacro-end-macro kmacro-end-and-call-macro))
+ (cancel-kbd-macro-events)))
+
;; If we got a mouse click event, that event contains the
;; window clicked on. maybe it was read with the buffer
;; it was clicked on. If so, that buffer, not the current one,




Juri Linkov

unread,
Aug 27, 2013, 12:06:58 PM8/27/13
to Simon Katz, 15126...@debbugs.gnu.org
>> In Emacs 24.3.1, kmacro-end-and-call-macro calls the macro repeatedly
>> making changes to all the repeated text up to the end of the file.
>
> It's clear that neither `C-x' nor `C-x e' should be stored.
> So not storing `C-x e' will not execute the same macro repeatedly.

This case is fixed now. Thanks for the bug report.

There is another case where instead of `C-x e'
typing more verbosely `M-x kmacro-end-and-call-macro RET'
will store this sequence in the macro.

But it's not a isearch specific problem as it can be reproduced
without isearch by the test case:

M-x kmacro-start-macro RET x x x x
M-x kmacro-end-and-call-macro RET

It doesn't stop after the first macro execution
because it stores M-x and the command in the macro:

Macro:
4*x ;; self-insert-command
M-x ;; execute-extended-command
kmacro-end-and-call-macro ;; self-insert-command * 25

This is a minor problem since nobody reported it
because there are more convenient keys to do the same
with `C-x ( x x x x C-x e' (or F3/F4).



Simon Katz

unread,
Sep 1, 2013, 9:10:40 AM9/1/13
to Juri Linkov, Simon Katz, 15126...@debbugs.gnu.org
Great, and thanks for the additional info.




0 new messages