diff options
author | Richard M. Stallman <rms@gnu.org> | 1999-12-13 03:50:21 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1999-12-13 03:50:21 +0000 |
commit | f84db7d56a040a7e6bf21046d9a8970732eb71a1 (patch) | |
tree | 70429efde2e435b4b740f9f3bf558764b60bdefb /src/macros.c | |
parent | d3887e33a93c9d1dc3b2d61785f860bac8bff6b9 (diff) | |
download | emacs-f84db7d56a040a7e6bf21046d9a8970732eb71a1.tar.gz |
(Fstart_kbd_macro): Handle case where last-kbd-macro
has been changed by the Lisp code.
Diffstat (limited to 'src/macros.c')
-rw-r--r-- | src/macros.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/macros.c b/src/macros.c index a0212e1044a..5c37f0daa3d 100644 --- a/src/macros.c +++ b/src/macros.c @@ -90,10 +90,38 @@ Non-nil arg (prefix arg) means append to last macro defined;\n\ } else { - message ("Appending to kbd macro..."); - current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; + int i, len; + + /* Check the type of last-kbd-macro in case Lisp code changed it. */ + if (!STRINGP (current_kboard->Vlast_kbd_macro) + && !VECTORP (current_kboard->Vlast_kbd_macro)) + current_kboard->Vlast_kbd_macro + = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro); + + len = XINT (Flength (current_kboard->Vlast_kbd_macro)); + + /* Copy last-kbd-macro into the buffer, in case the Lisp code + has put another macro there. */ + if (current_kboard->kbd_macro_bufsize < len + 30) + { + current_kboard->kbd_macro_bufsize = len + 30; + current_kboard->kbd_macro_buffer + = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer, + (len + 30) * sizeof (Lisp_Object)); + } + for (i = 0; i < len; i++) + current_kboard->kbd_macro_buffer[i] + = Faref (current_kboard->Vlast_kbd_macro, make_number (i)); + + current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len; + current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr; + + /* Re-execute the macro we are appending to, + for consistency of behavior. */ Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, make_number (1)); + + message ("Appending to kbd macro..."); } current_kboard->defining_kbd_macro = Qt; |