(Vthis_command): Renamed from this_command.
[bpt/emacs.git] / src / macros.c
CommitLineData
5a7f5d07 1/* Keyboard macros.
c6c5df7f 2 Copyright (C) 1985, 1986, 1993 Free Software Foundation, Inc.
5a7f5d07
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
502ddf23 8the Free Software Foundation; either version 2, or (at your option)
5a7f5d07
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
5a7f5d07
JB
20
21
18160b98 22#include <config.h>
5a7f5d07
JB
23#include "lisp.h"
24#include "macros.h"
25#include "commands.h"
26#include "buffer.h"
27#include "window.h"
077d751f 28#include "keyboard.h"
5a7f5d07
JB
29
30Lisp_Object Qexecute_kbd_macro;
31
d4087e06
RS
32/* Kbd macro currently being executed (a string or vector). */
33
5a7f5d07 34Lisp_Object Vexecuting_macro;
d4087e06
RS
35
36/* Index of next character to fetch from that macro. */
37
5a7f5d07
JB
38int executing_macro_index;
39
d4087e06
RS
40/* Number of successful iterations so far
41 for innermost keyboard macro.
42 This is not bound at each level,
43 so after an error, it describes the innermost interrupted macro. */
44
45int executing_macro_iterations;
46
47/* This is the macro that was executing.
48 This is not bound at each level,
49 so after an error, it describes the innermost interrupted macro.
50 We use it only as a kind of flag, so no need to protect it. */
51
52Lisp_Object executing_macro;
53
5a7f5d07
JB
54Lisp_Object Fexecute_kbd_macro ();
55\f
56DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P",
57 "Record subsequent keyboard input, defining a keyboard macro.\n\
58The commands are recorded even as they are executed.\n\
59Use \\[end-kbd-macro] to finish recording and make the macro available.\n\
60Use \\[name-last-kbd-macro] to give it a permanent name.\n\
61Non-nil arg (prefix arg) means append to last macro defined;\n\
62 This begins by re-executing that macro as if you typed it again.")
63 (append)
64 Lisp_Object append;
65{
cd8b5aa3 66 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07
JB
67 error ("Already defining kbd macro");
68
cd8b5aa3 69 if (!current_kboard->kbd_macro_buffer)
8b97da83 70 {
cd8b5aa3
KH
71 current_kboard->kbd_macro_bufsize = 30;
72 current_kboard->kbd_macro_buffer
9e7c370a 73 = (Lisp_Object *)xmalloc (30 * sizeof (Lisp_Object));
8b97da83 74 }
5a7f5d07 75 update_mode_lines++;
265a9e55 76 if (NILP (append))
5a7f5d07 77 {
9e7c370a
KH
78 if (current_kboard->kbd_macro_bufsize > 200)
79 {
80 current_kboard->kbd_macro_bufsize = 30;
81 current_kboard->kbd_macro_buffer
96a60349
KH
82 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
83 30 * sizeof (Lisp_Object));
9e7c370a 84 }
cd8b5aa3
KH
85 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
86 current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
9e7c370a 87 message ("Defining kbd macro...");
5a7f5d07
JB
88 }
89 else
90 {
9e7c370a 91 message ("Appending to kbd macro...");
cd8b5aa3
KH
92 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
93 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
9e1ffae2 94 make_number (1));
5a7f5d07 95 }
cd8b5aa3 96 current_kboard->defining_kbd_macro = Qt;
5a7f5d07
JB
97
98 return Qnil;
99}
100
101DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 1, "p",
102 "Finish defining a keyboard macro.\n\
103The definition was started by \\[start-kbd-macro].\n\
104The macro is now available for use via \\[call-last-kbd-macro],\n\
105or it can be given a name with \\[name-last-kbd-macro] and then invoked\n\
106under that name.\n\
107\n\
108With numeric arg, repeat macro now that many times,\n\
109counting the definition just completed as the first repetition.\n\
110An argument of zero means repeat until error.")
86a3ca5e
EN
111 (repeat)
112 Lisp_Object repeat;
5a7f5d07 113{
cd8b5aa3 114 if (NILP (current_kboard->defining_kbd_macro))
d86ad277 115 error ("Not defining kbd macro");
5a7f5d07 116
86a3ca5e
EN
117 if (NILP (repeat))
118 XSETFASTINT (repeat, 1);
5a7f5d07 119 else
86a3ca5e 120 CHECK_NUMBER (repeat, 0);
5a7f5d07 121
cd8b5aa3 122 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07 123 {
cd8b5aa3 124 current_kboard->defining_kbd_macro = Qnil;
5a7f5d07 125 update_mode_lines++;
cd8b5aa3
KH
126 current_kboard->Vlast_kbd_macro
127 = make_event_array ((current_kboard->kbd_macro_end
128 - current_kboard->kbd_macro_buffer),
129 current_kboard->kbd_macro_buffer);
9e7c370a 130 message ("Keyboard macro defined");
5a7f5d07
JB
131 }
132
86a3ca5e
EN
133 if (XFASTINT (repeat) == 0)
134 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
5a7f5d07
JB
135 else
136 {
86a3ca5e
EN
137 XSETINT (repeat, XINT (repeat)-1);
138 if (XINT (repeat) > 0)
139 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
5a7f5d07
JB
140 }
141 return Qnil;
142}
143
144/* Store character c into kbd macro being defined */
145
c3fd8dd5 146void
5a7f5d07
JB
147store_kbd_macro_char (c)
148 Lisp_Object c;
149{
cd8b5aa3 150 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07 151 {
cd8b5aa3
KH
152 if ((current_kboard->kbd_macro_ptr
153 - current_kboard->kbd_macro_buffer)
154 == current_kboard->kbd_macro_bufsize)
5a7f5d07 155 {
8b97da83 156 register Lisp_Object *new;
cd8b5aa3
KH
157 current_kboard->kbd_macro_bufsize *= 2;
158 new = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
159 (current_kboard->kbd_macro_bufsize
8b97da83 160 * sizeof (Lisp_Object)));
cd8b5aa3
KH
161 current_kboard->kbd_macro_ptr
162 += new - current_kboard->kbd_macro_buffer;
163 current_kboard->kbd_macro_end
164 += new - current_kboard->kbd_macro_buffer;
165 current_kboard->kbd_macro_buffer = new;
5a7f5d07 166 }
cd8b5aa3 167 *current_kboard->kbd_macro_ptr++ = c;
5a7f5d07
JB
168 }
169}
170
171/* Declare that all chars stored so far in the kbd macro being defined
172 really belong to it. This is done in between editor commands. */
173
c3fd8dd5 174void
5a7f5d07
JB
175finalize_kbd_macro_chars ()
176{
cd8b5aa3 177 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
5a7f5d07 178}
199afd29
RS
179
180DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
181 Scancel_kbd_macro_events, 0, 0, 0,
182 "Cancel the events added to a keyboard macro for this command.")
183 ()
184{
185 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
186}
2d5f65a9
KH
187
188DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
189 Sstore_kbd_macro_event, 1, 1, 0,
190 "Store EVENT into the keyboard macro being defined.")
191 (event)
192 Lisp_Object event;
193{
194 store_kbd_macro_char (event);
195 return Qnil;
196}
5a7f5d07
JB
197\f
198DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
199 0, 1, "p",
200 "Call the last keyboard macro that you defined with \\[start-kbd-macro].\n\
201\n\
202A prefix argument serves as a repeat count. Zero means repeat until error.\n\
203\n\
204To make a macro permanent so you can call it even after\n\
205defining others, use \\[name-last-kbd-macro].")
206 (prefix)
207 Lisp_Object prefix;
208{
4315204e
RS
209 /* Don't interfere with recognition of the previous command
210 from before this macro started. */
211 this_command = current_kboard->Vlast_command;
212
cd8b5aa3 213 if (! NILP (current_kboard->defining_kbd_macro))
5a7f5d07 214 error ("Can't execute anonymous macro while defining one");
cd8b5aa3 215 else if (NILP (current_kboard->Vlast_kbd_macro))
5a7f5d07
JB
216 error ("No kbd macro has been defined");
217 else
cd8b5aa3 218 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, prefix);
4315204e
RS
219
220 /* command_loop_1 sets this to nil before it returns;
221 get back the last command within the macro
222 so that it can be last, again, after we return. */
223 this_command = current_kboard->Vlast_command;
224
5a7f5d07
JB
225 return Qnil;
226}
227
228/* Restore Vexecuting_macro and executing_macro_index - called when
229 the unwind-protect in Fexecute_kbd_macro gets invoked. */
d4087e06 230
5a7f5d07
JB
231static Lisp_Object
232pop_kbd_macro (info)
233 Lisp_Object info;
234{
235 Lisp_Object tem;
236 Vexecuting_macro = Fcar (info);
237 tem = Fcdr (info);
238 executing_macro_index = XINT (tem);
239 return Qnil;
240}
241
242DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 2, 0,
243 "Execute MACRO as string of editor command characters.\n\
244If MACRO is a symbol, its function definition is used.\n\
245COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
86a3ca5e
EN
246 (macro, count)
247 Lisp_Object macro, count;
5a7f5d07
JB
248{
249 Lisp_Object final;
250 Lisp_Object tem;
52d9c145 251 int pdlcount = specpdl_ptr - specpdl;
5a7f5d07
JB
252 int repeat = 1;
253 struct gcpro gcpro1;
d4087e06 254 int success_count = 0;
5a7f5d07 255
1c8c5693
EN
256 if (!NILP (count))
257 {
258 count = Fprefix_numeric_value (count);
259 repeat = XINT (count);
260 }
5a7f5d07 261
502ddf23 262 final = indirect_function (macro);
65346ae6 263 if (!STRINGP (final) && !VECTORP (final))
d86ad277 264 error ("Keyboard macros must be strings or vectors");
5a7f5d07 265
a4773b43 266 XSETFASTINT (tem, executing_macro_index);
5a7f5d07
JB
267 tem = Fcons (Vexecuting_macro, tem);
268 record_unwind_protect (pop_kbd_macro, tem);
269
270 GCPRO1 (final);
271 do
272 {
273 Vexecuting_macro = final;
d4087e06 274 executing_macro = final;
5a7f5d07
JB
275 executing_macro_index = 0;
276
04609ce4 277 current_kboard->Vprefix_arg = Qnil;
5a7f5d07 278 command_loop_1 ();
e86f81cc 279
d4087e06
RS
280 executing_macro_iterations = ++success_count;
281
e86f81cc 282 QUIT;
5a7f5d07 283 }
65346ae6
KH
284 while (--repeat
285 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
5a7f5d07 286
d4087e06
RS
287 executing_macro = Qnil;
288
5a7f5d07 289 UNGCPRO;
52d9c145 290 return unbind_to (pdlcount, Qnil);
5a7f5d07
JB
291}
292\f
c3fd8dd5 293void
5a7f5d07
JB
294init_macros ()
295{
5a7f5d07 296 Vexecuting_macro = Qnil;
1ab778be 297 executing_macro = Qnil;
5a7f5d07
JB
298}
299
c3fd8dd5 300void
5a7f5d07
JB
301syms_of_macros ()
302{
5a7f5d07
JB
303 Qexecute_kbd_macro = intern ("execute-kbd-macro");
304 staticpro (&Qexecute_kbd_macro);
305
306 defsubr (&Sstart_kbd_macro);
307 defsubr (&Send_kbd_macro);
308 defsubr (&Scall_last_kbd_macro);
309 defsubr (&Sexecute_kbd_macro);
199afd29 310 defsubr (&Scancel_kbd_macro_events);
2d5f65a9 311 defsubr (&Sstore_kbd_macro_event);
5a7f5d07 312
cd8b5aa3 313 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
5a7f5d07
JB
314 "Non-nil while a keyboard macro is being defined. Don't set this!");
315
316 DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
9e1ffae2 317 "Currently executing keyboard macro (string or vector); nil if none executing.");
5a7f5d07
JB
318
319 DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
9e1ffae2 320 "Currently executing keyboard macro (string or vector); nil if none executing.");
5a7f5d07 321
cd8b5aa3 322 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
9e1ffae2 323 "Last kbd macro defined, as a string or vector; nil if none defined.");
5a7f5d07
JB
324}
325
c3fd8dd5 326void
5a7f5d07
JB
327keys_of_macros ()
328{
329 initial_define_key (control_x_map, ('e'), "call-last-kbd-macro");
330 initial_define_key (control_x_map, ('('), "start-kbd-macro");
331 initial_define_key (control_x_map, (')'), "end-kbd-macro");
332}