unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Luc Teirlinck <teirllm@dms.auburn.edu>
Cc: emacs-devel@gnu.org
Subject: Re: Another bug with the macro counter
Date: Fri, 29 Oct 2004 21:38:24 -0500 (CDT)	[thread overview]
Message-ID: <200410300238.i9U2cOD02290@raven.dms.auburn.edu> (raw)
In-Reply-To: <200410210107.i9L176B10842@raven.dms.auburn.edu> (message from Luc Teirlinck on Wed, 20 Oct 2004 20:07:06 -0500 (CDT))

>From my earlier message:

   Do `emacs -q'.

   C-x ( a C-x C-k C-i b RET C-x )
   C-x e e e
   C-x ( C-g
   C-x e

   Result:

   a0b
   a1b
   a2b
   a3b
   a0b

   Of course, the newly to be defined macro got its counter reset to 0.
   But after we changed our mind, decided not to define a macro and quit,
   there is no reason why the counter for the previously defined macro
   should be reset to 0.

Actually, that was a misinterpretation.  There is a problem in the
above, but not the one I suspected.

The problem is that after the user quits while defining a macro, the
old head of the keyboard macro ring is still the head, with a reset
counter (because `kmacro-start-macro' reset it).  That _same_ macro is
now however _also_ the previous macro on the ring (but with the
original counter) because `kmacro-start-macro' already pushed it onto
the macro ring.  That duplication is confusing to the user, _even_ if
the user does not care about the counter.

The patches below fix the bug.  If they look OK, I will install them
after doing some extra final checking.

There is one thing that the patches below do not fix: they do not
reset `kmacro-last-counter' correctly.  To fix that, as well as
several other bugs related to the keyboard macro counter, the elements
of `kmacro-ring' should be quadruples (MACRO COUNTER LAST-COUNTER FORMAT)
rather than triples (MACRO COUNTER FORMAT).  If there is more than one
keyboard macro _all_ the relevant information needs to be stored in
`kmacro-ring'.  The patches below do not do that.

The patch to simple.el also quiets the compiler for `edebug-active'.
This is unrelated, but while getting rid of compiler warnings related
to my patch, I can quite as well get rid of all warnings.  (I checked
that the warnings are really false alarms.)

===File ~/kmacro.el-diff====================================
*** kmacro.el	11 Oct 2004 17:28:10 -0500	1.23
--- kmacro.el	29 Oct 2004 20:17:12 -0500	
***************
*** 218,223 ****
--- 218,226 ----
  ;;;###autoload (global-set-key "\C-x\C-k" 'kmacro-keymap)
  ;;;###autoload (autoload 'kmacro-keymap "kmacro" "Keymap for keyboard macro commands." t 'keymap)
  
+ (defvar appending-to-kbd-macro nil
+   "Non-nil when appending to a keyboard macro definition.")
+ 
  (if kmacro-call-mouse-event
    (global-set-key (vector kmacro-call-mouse-event) 'kmacro-end-call-mouse))
  
***************
*** 564,569 ****
--- 567,573 ----
    (if (or defining-kbd-macro executing-kbd-macro)
        (message "Already defining keyboard macro.")
      (let ((append (and arg (listp arg))))
+       (setq appending-to-kbd-macro append)
        (unless append
  	(if last-kbd-macro
  	    (let ((len (length kmacro-ring)))
============================================================

===File ~/simple-diff=======================================
*** simple.el	25 Oct 2004 07:40:49 -0500	1.664
--- simple.el	29 Oct 2004 20:39:08 -0500	
***************
*** 865,873 ****
    (if (and (integerp value)
             (or (not (memq this-command '(eval-last-sexp eval-print-last-sexp)))
                 (eq this-command last-command)
!                (and (boundp 'edebug-active) edebug-active)))
        (let ((char-string
!              (if (or (and (boundp 'edebug-active) edebug-active)
                       (memq this-command '(eval-last-sexp eval-print-last-sexp)))
                   (prin1-char value))))
          (if char-string
--- 865,874 ----
    (if (and (integerp value)
             (or (not (memq this-command '(eval-last-sexp eval-print-last-sexp)))
                 (eq this-command last-command)
!                (and (boundp 'edebug-active) (with-no-warnings edebug-active))))
        (let ((char-string
!              (if (or (and (boundp 'edebug-active)
! 			  (with-no-warnings edebug-active))
                       (memq this-command '(eval-last-sexp eval-print-last-sexp)))
                   (prin1-char value))))
          (if char-string
***************
*** 3916,3921 ****
--- 3917,3927 ----
  At top-level, as an editor command, this simply beeps."
    (interactive)
    (deactivate-mark)
+   (or (not (featurep 'kmacro))
+       (with-no-warnings appending-to-kbd-macro)
+       (kmacro-ring-empty-p)
+       (kmacro-pop-ring)
+       (with-no-warnings (setq appending-to-kbd-macro nil)))
    (setq defining-kbd-macro nil)
    (signal 'quit nil))
  
============================================================

  reply	other threads:[~2004-10-30  2:38 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-10-21  1:07 Another bug with the macro counter Luc Teirlinck
2004-10-30  2:38 ` Luc Teirlinck [this message]
2004-10-30  3:27   ` Luc Teirlinck
2004-10-30  4:06     ` Stefan
2004-10-30 14:19       ` Luc Teirlinck
2004-10-30 16:12         ` Stefan
2004-10-30 18:06           ` David Kastrup
2004-10-30 23:13             ` Luc Teirlinck
2004-10-31  0:09             ` Stefan
2004-10-31  7:43               ` David Kastrup
2004-10-31 13:30                 ` Andreas Schwab
2004-10-31 17:05                 ` Stefan
2004-10-31 18:36                   ` David Kastrup
2004-10-31 18:52                     ` Luc Teirlinck
2004-10-30 14:24       ` Luc Teirlinck
2004-10-30 14:51       ` Luc Teirlinck
2004-10-30 21:57         ` Kim F. Storm
2004-10-30 22:04           ` Luc Teirlinck
2004-10-30 22:09             ` Luc Teirlinck
2004-10-30 22:43             ` Kim F. Storm
2004-10-31 21:01           ` Luc Teirlinck
2004-10-31 23:23             ` Kim F. Storm
2004-11-01  7:24           ` Richard Stallman
2004-10-31  9:42       ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200410300238.i9U2cOD02290@raven.dms.auburn.edu \
    --to=teirllm@dms.auburn.edu \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).