emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Another bug with the macro counter


From: Luc Teirlinck
Subject: Re: Another bug with the macro counter
Date: Fri, 29 Oct 2004 21:38:24 -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 via email to

[Prev in Thread] Current Thread [Next in Thread]