(end_kbd_macro): New function.
[bpt/emacs.git] / src / macros.c
CommitLineData
5a7f5d07 1/* Keyboard macros.
2136b408 2 Copyright (C) 1985, 1986, 1993, 2000, 2001 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 29
2136b408 30Lisp_Object Qexecute_kbd_macro, Qkbd_macro_termination_hook;
5a7f5d07 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
64799df5 38EMACS_INT executing_macro_index;
5a7f5d07 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
b80d5655
RS
54extern Lisp_Object real_this_command;
55
5a7f5d07
JB
56Lisp_Object Fexecute_kbd_macro ();
57\f
f90d3a6b 58DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 2, "P",
70da46c3
PJ
59 doc: /* Record subsequent keyboard input, defining a keyboard macro.
60The commands are recorded even as they are executed.
61Use \\[end-kbd-macro] to finish recording and make the macro available.
62Use \\[name-last-kbd-macro] to give it a permanent name.
63Non-nil arg (prefix arg) means append to last macro defined;
f90d3a6b
KS
64this begins by re-executing that macro as if you typed it again.
65If optional second arg, NO-EXEC, is non-nil, do not re-execute last
66macro before appending to it. */)
67 (append, no_exec)
68 Lisp_Object append, no_exec;
5a7f5d07 69{
cd8b5aa3 70 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07
JB
71 error ("Already defining kbd macro");
72
cd8b5aa3 73 if (!current_kboard->kbd_macro_buffer)
8b97da83 74 {
cd8b5aa3
KH
75 current_kboard->kbd_macro_bufsize = 30;
76 current_kboard->kbd_macro_buffer
9e7c370a 77 = (Lisp_Object *)xmalloc (30 * sizeof (Lisp_Object));
8b97da83 78 }
5a7f5d07 79 update_mode_lines++;
265a9e55 80 if (NILP (append))
5a7f5d07 81 {
9e7c370a
KH
82 if (current_kboard->kbd_macro_bufsize > 200)
83 {
84 current_kboard->kbd_macro_bufsize = 30;
85 current_kboard->kbd_macro_buffer
96a60349
KH
86 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
87 30 * sizeof (Lisp_Object));
9e7c370a 88 }
cd8b5aa3
KH
89 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
90 current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
9e7c370a 91 message ("Defining kbd macro...");
5a7f5d07
JB
92 }
93 else
94 {
f84db7d5
RS
95 int i, len;
96
97 /* Check the type of last-kbd-macro in case Lisp code changed it. */
98 if (!STRINGP (current_kboard->Vlast_kbd_macro)
99 && !VECTORP (current_kboard->Vlast_kbd_macro))
100 current_kboard->Vlast_kbd_macro
101 = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro);
102
103 len = XINT (Flength (current_kboard->Vlast_kbd_macro));
104
105 /* Copy last-kbd-macro into the buffer, in case the Lisp code
106 has put another macro there. */
107 if (current_kboard->kbd_macro_bufsize < len + 30)
108 {
109 current_kboard->kbd_macro_bufsize = len + 30;
110 current_kboard->kbd_macro_buffer
111 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
112 (len + 30) * sizeof (Lisp_Object));
113 }
114 for (i = 0; i < len; i++)
115 current_kboard->kbd_macro_buffer[i]
116 = Faref (current_kboard->Vlast_kbd_macro, make_number (i));
117
118 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len;
119 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
120
121 /* Re-execute the macro we are appending to,
122 for consistency of behavior. */
f90d3a6b
KS
123 if (NILP (no_exec))
124 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
125 make_number (1), Qnil);
f84db7d5
RS
126
127 message ("Appending to kbd macro...");
5a7f5d07 128 }
cd8b5aa3 129 current_kboard->defining_kbd_macro = Qt;
5a7f5d07
JB
130
131 return Qnil;
132}
133
eeb8fc0d
KS
134/* Finish defining the current keyboard macro. */
135
136void
137end_kbd_macro ()
138{
139 current_kboard->defining_kbd_macro = Qnil;
140 update_mode_lines++;
141 current_kboard->Vlast_kbd_macro
142 = make_event_array ((current_kboard->kbd_macro_end
143 - current_kboard->kbd_macro_buffer),
144 current_kboard->kbd_macro_buffer);
145}
146
f90d3a6b 147DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",
70da46c3
PJ
148 doc: /* Finish defining a keyboard macro.
149The definition was started by \\[start-kbd-macro].
150The macro is now available for use via \\[call-last-kbd-macro],
151or it can be given a name with \\[name-last-kbd-macro] and then invoked
152under that name.
153
154With numeric arg, repeat macro now that many times,
155counting the definition just completed as the first repetition.
f90d3a6b
KS
156An argument of zero means repeat until error.
157
158In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
159each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
160 (repeat, loopfunc)
161 Lisp_Object repeat, loopfunc;
5a7f5d07 162{
cd8b5aa3 163 if (NILP (current_kboard->defining_kbd_macro))
d86ad277 164 error ("Not defining kbd macro");
5a7f5d07 165
86a3ca5e
EN
166 if (NILP (repeat))
167 XSETFASTINT (repeat, 1);
5a7f5d07 168 else
b7826503 169 CHECK_NUMBER (repeat);
5a7f5d07 170
cd8b5aa3 171 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07 172 {
eeb8fc0d 173 end_kbd_macro ();
9e7c370a 174 message ("Keyboard macro defined");
5a7f5d07
JB
175 }
176
86a3ca5e 177 if (XFASTINT (repeat) == 0)
f90d3a6b 178 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
5a7f5d07
JB
179 else
180 {
86a3ca5e
EN
181 XSETINT (repeat, XINT (repeat)-1);
182 if (XINT (repeat) > 0)
f90d3a6b 183 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
5a7f5d07
JB
184 }
185 return Qnil;
186}
187
188/* Store character c into kbd macro being defined */
189
c3fd8dd5 190void
5a7f5d07
JB
191store_kbd_macro_char (c)
192 Lisp_Object c;
193{
08e1d6df
GM
194 struct kboard *kb = current_kboard;
195
196 if (!NILP (kb->defining_kbd_macro))
5a7f5d07 197 {
08e1d6df 198 if (kb->kbd_macro_ptr - kb->kbd_macro_buffer == kb->kbd_macro_bufsize)
5a7f5d07 199 {
08e1d6df
GM
200 int ptr_offset, end_offset, nbytes;
201
202 ptr_offset = kb->kbd_macro_ptr - kb->kbd_macro_buffer;
203 end_offset = kb->kbd_macro_end - kb->kbd_macro_buffer;
204 kb->kbd_macro_bufsize *= 2;
205 nbytes = kb->kbd_macro_bufsize * sizeof *kb->kbd_macro_buffer;
206 kb->kbd_macro_buffer
207 = (Lisp_Object *) xrealloc (kb->kbd_macro_buffer, nbytes);
208 kb->kbd_macro_ptr = kb->kbd_macro_buffer + ptr_offset;
209 kb->kbd_macro_end = kb->kbd_macro_buffer + end_offset;
5a7f5d07 210 }
23751e25 211
08e1d6df 212 *kb->kbd_macro_ptr++ = c;
5a7f5d07
JB
213 }
214}
215
216/* Declare that all chars stored so far in the kbd macro being defined
217 really belong to it. This is done in between editor commands. */
218
c3fd8dd5 219void
5a7f5d07
JB
220finalize_kbd_macro_chars ()
221{
cd8b5aa3 222 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
5a7f5d07 223}
199afd29
RS
224
225DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
226 Scancel_kbd_macro_events, 0, 0, 0,
70da46c3
PJ
227 doc: /* Cancel the events added to a keyboard macro for this command. */)
228 ()
199afd29
RS
229{
230 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
6bbd7a29 231 return Qnil;
199afd29 232}
2d5f65a9
KH
233
234DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
235 Sstore_kbd_macro_event, 1, 1, 0,
70da46c3
PJ
236 doc: /* Store EVENT into the keyboard macro being defined. */)
237 (event)
2d5f65a9
KH
238 Lisp_Object event;
239{
240 store_kbd_macro_char (event);
241 return Qnil;
242}
5a7f5d07
JB
243\f
244DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
f90d3a6b 245 0, 2, "p",
70da46c3
PJ
246 doc: /* Call the last keyboard macro that you defined with \\[start-kbd-macro].
247
248A prefix argument serves as a repeat count. Zero means repeat until error.
249
250To make a macro permanent so you can call it even after
f90d3a6b
KS
251defining others, use \\[name-last-kbd-macro].
252
253In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
254each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
255 (prefix, loopfunc)
256 Lisp_Object prefix, loopfunc;
5a7f5d07 257{
4315204e
RS
258 /* Don't interfere with recognition of the previous command
259 from before this macro started. */
14a18790 260 Vthis_command = current_kboard->Vlast_command;
80184dac
KH
261 /* C-x z after the macro should repeat the macro. */
262 real_this_command = current_kboard->Vlast_kbd_macro;
4315204e 263
cd8b5aa3 264 if (! NILP (current_kboard->defining_kbd_macro))
5a7f5d07 265 error ("Can't execute anonymous macro while defining one");
cd8b5aa3 266 else if (NILP (current_kboard->Vlast_kbd_macro))
5a7f5d07
JB
267 error ("No kbd macro has been defined");
268 else
f90d3a6b 269 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, prefix, loopfunc);
4315204e
RS
270
271 /* command_loop_1 sets this to nil before it returns;
272 get back the last command within the macro
273 so that it can be last, again, after we return. */
14a18790 274 Vthis_command = current_kboard->Vlast_command;
4315204e 275
5a7f5d07
JB
276 return Qnil;
277}
278
279/* Restore Vexecuting_macro and executing_macro_index - called when
280 the unwind-protect in Fexecute_kbd_macro gets invoked. */
d4087e06 281
5a7f5d07
JB
282static Lisp_Object
283pop_kbd_macro (info)
284 Lisp_Object info;
285{
286 Lisp_Object tem;
80184dac
KH
287 Vexecuting_macro = XCAR (info);
288 tem = XCDR (info);
289 executing_macro_index = XINT (XCAR (tem));
290 real_this_command = XCDR (tem);
2136b408 291 Frun_hooks (1, &Qkbd_macro_termination_hook);
5a7f5d07
JB
292 return Qnil;
293}
294
f90d3a6b 295DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 3, 0,
70da46c3
PJ
296 doc: /* Execute MACRO as string of editor command characters.
297If MACRO is a symbol, its function definition is used.
f90d3a6b
KS
298COUNT is a repeat count, or nil for once, or 0 for infinite loop.
299
300Optional third arg LOOPFUNC may be a function that is called prior to
301each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
302 (macro, count, loopfunc)
303 Lisp_Object macro, count, loopfunc;
5a7f5d07
JB
304{
305 Lisp_Object final;
306 Lisp_Object tem;
65b21658 307 int pdlcount = SPECPDL_INDEX ();
5a7f5d07 308 int repeat = 1;
f90d3a6b 309 struct gcpro gcpro1, gcpro2;
d4087e06 310 int success_count = 0;
5a7f5d07 311
4b7da890
KH
312 executing_macro_iterations = 0;
313
1c8c5693
EN
314 if (!NILP (count))
315 {
316 count = Fprefix_numeric_value (count);
317 repeat = XINT (count);
318 }
5a7f5d07 319
502ddf23 320 final = indirect_function (macro);
65346ae6 321 if (!STRINGP (final) && !VECTORP (final))
d86ad277 322 error ("Keyboard macros must be strings or vectors");
5a7f5d07 323
80184dac
KH
324 tem = Fcons (Vexecuting_macro,
325 Fcons (make_number (executing_macro_index),
326 real_this_command));
5a7f5d07
JB
327 record_unwind_protect (pop_kbd_macro, tem);
328
f90d3a6b 329 GCPRO2 (final, loopfunc);
5a7f5d07
JB
330 do
331 {
332 Vexecuting_macro = final;
d4087e06 333 executing_macro = final;
5a7f5d07
JB
334 executing_macro_index = 0;
335
04609ce4 336 current_kboard->Vprefix_arg = Qnil;
f90d3a6b
KS
337
338 if (!NILP (loopfunc))
339 {
340 Lisp_Object cont;
341 cont = call0 (loopfunc);
342 if (NILP (cont))
343 break;
344 }
345
5a7f5d07 346 command_loop_1 ();
e86f81cc 347
d4087e06
RS
348 executing_macro_iterations = ++success_count;
349
e86f81cc 350 QUIT;
5a7f5d07 351 }
65346ae6
KH
352 while (--repeat
353 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
5a7f5d07 354
d4087e06
RS
355 executing_macro = Qnil;
356
b80d5655
RS
357 real_this_command = Vexecuting_macro;
358
5a7f5d07 359 UNGCPRO;
52d9c145 360 return unbind_to (pdlcount, Qnil);
5a7f5d07
JB
361}
362\f
c3fd8dd5 363void
5a7f5d07
JB
364init_macros ()
365{
5a7f5d07 366 Vexecuting_macro = Qnil;
1ab778be 367 executing_macro = Qnil;
5a7f5d07
JB
368}
369
c3fd8dd5 370void
5a7f5d07
JB
371syms_of_macros ()
372{
5a7f5d07
JB
373 Qexecute_kbd_macro = intern ("execute-kbd-macro");
374 staticpro (&Qexecute_kbd_macro);
2136b408
GM
375 Qkbd_macro_termination_hook = intern ("kbd-macro-termination-hook");
376 staticpro (&Qkbd_macro_termination_hook);
5a7f5d07
JB
377
378 defsubr (&Sstart_kbd_macro);
379 defsubr (&Send_kbd_macro);
380 defsubr (&Scall_last_kbd_macro);
381 defsubr (&Sexecute_kbd_macro);
199afd29 382 defsubr (&Scancel_kbd_macro_events);
2d5f65a9 383 defsubr (&Sstore_kbd_macro_event);
5a7f5d07 384
cd8b5aa3 385 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
70da46c3 386 doc: /* Non-nil while a keyboard macro is being defined. Don't set this! */);
5a7f5d07
JB
387
388 DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
70da46c3 389 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
5a7f5d07 390
64799df5
KS
391 DEFVAR_INT ("executing-macro-index", &executing_macro_index,
392 doc: /* Index in currently executing keyboard macro; undefined if none executing. */);
393
5a7f5d07 394 DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
70da46c3 395 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
5a7f5d07 396
cd8b5aa3 397 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
70da46c3 398 doc: /* Last kbd macro defined, as a string or vector; nil if none defined. */);
5a7f5d07 399}