diff options
| author | Richard M. Stallman | 1999-12-13 03:50:21 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1999-12-13 03:50:21 +0000 |
| commit | f84db7d56a040a7e6bf21046d9a8970732eb71a1 (patch) | |
| tree | 70429efde2e435b4b740f9f3bf558764b60bdefb /src | |
| parent | d3887e33a93c9d1dc3b2d61785f860bac8bff6b9 (diff) | |
| download | emacs-f84db7d56a040a7e6bf21046d9a8970732eb71a1.tar.gz emacs-f84db7d56a040a7e6bf21046d9a8970732eb71a1.zip | |
(Fstart_kbd_macro): Handle case where last-kbd-macro
has been changed by the Lisp code.
Diffstat (limited to 'src')
| -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\ | |||
| 90 | } | 90 | } |
| 91 | else | 91 | else |
| 92 | { | 92 | { |
| 93 | message ("Appending to kbd macro..."); | 93 | int i, len; |
| 94 | current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; | 94 | |
| 95 | /* Check the type of last-kbd-macro in case Lisp code changed it. */ | ||
| 96 | if (!STRINGP (current_kboard->Vlast_kbd_macro) | ||
| 97 | && !VECTORP (current_kboard->Vlast_kbd_macro)) | ||
| 98 | current_kboard->Vlast_kbd_macro | ||
| 99 | = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro); | ||
| 100 | |||
| 101 | len = XINT (Flength (current_kboard->Vlast_kbd_macro)); | ||
| 102 | |||
| 103 | /* Copy last-kbd-macro into the buffer, in case the Lisp code | ||
| 104 | has put another macro there. */ | ||
| 105 | if (current_kboard->kbd_macro_bufsize < len + 30) | ||
| 106 | { | ||
| 107 | current_kboard->kbd_macro_bufsize = len + 30; | ||
| 108 | current_kboard->kbd_macro_buffer | ||
| 109 | = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer, | ||
| 110 | (len + 30) * sizeof (Lisp_Object)); | ||
| 111 | } | ||
| 112 | for (i = 0; i < len; i++) | ||
| 113 | current_kboard->kbd_macro_buffer[i] | ||
| 114 | = Faref (current_kboard->Vlast_kbd_macro, make_number (i)); | ||
| 115 | |||
| 116 | current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len; | ||
| 117 | current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr; | ||
| 118 | |||
| 119 | /* Re-execute the macro we are appending to, | ||
| 120 | for consistency of behavior. */ | ||
| 95 | Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, | 121 | Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, |
| 96 | make_number (1)); | 122 | make_number (1)); |
| 123 | |||
| 124 | message ("Appending to kbd macro..."); | ||
| 97 | } | 125 | } |
| 98 | current_kboard->defining_kbd_macro = Qt; | 126 | current_kboard->defining_kbd_macro = Qt; |
| 99 | 127 | ||