(read-quoted-char): Apply listify-key-sequence to vector
[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
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
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
f90d3a6b 134DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",
70da46c3
PJ
135 doc: /* Finish defining a keyboard macro.
136The definition was started by \\[start-kbd-macro].
137The macro is now available for use via \\[call-last-kbd-macro],
138or it can be given a name with \\[name-last-kbd-macro] and then invoked
139under that name.
140
141With numeric arg, repeat macro now that many times,
142counting the definition just completed as the first repetition.
f90d3a6b
KS
143An argument of zero means repeat until error.
144
145In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
146each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
147 (repeat, loopfunc)
148 Lisp_Object repeat, loopfunc;
5a7f5d07 149{
cd8b5aa3 150 if (NILP (current_kboard->defining_kbd_macro))
d86ad277 151 error ("Not defining kbd macro");
5a7f5d07 152
86a3ca5e
EN
153 if (NILP (repeat))
154 XSETFASTINT (repeat, 1);
5a7f5d07 155 else
b7826503 156 CHECK_NUMBER (repeat);
5a7f5d07 157
cd8b5aa3 158 if (!NILP (current_kboard->defining_kbd_macro))
5a7f5d07 159 {
cd8b5aa3 160 current_kboard->defining_kbd_macro = Qnil;
5a7f5d07 161 update_mode_lines++;
cd8b5aa3
KH
162 current_kboard->Vlast_kbd_macro
163 = make_event_array ((current_kboard->kbd_macro_end
164 - current_kboard->kbd_macro_buffer),
165 current_kboard->kbd_macro_buffer);
9e7c370a 166 message ("Keyboard macro defined");
5a7f5d07
JB
167 }
168
86a3ca5e 169 if (XFASTINT (repeat) == 0)
f90d3a6b 170 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
5a7f5d07
JB
171 else
172 {
86a3ca5e
EN
173 XSETINT (repeat, XINT (repeat)-1);
174 if (XINT (repeat) > 0)
f90d3a6b 175 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
5a7f5d07
JB
176 }
177 return Qnil;
178}
179
180/* Store character c into kbd macro being defined */
181
c3fd8dd5 182void
5a7f5d07
JB
183store_kbd_macro_char (c)
184 Lisp_Object c;
185{
08e1d6df
GM
186 struct kboard *kb = current_kboard;
187
188 if (!NILP (kb->defining_kbd_macro))
5a7f5d07 189 {
08e1d6df 190 if (kb->kbd_macro_ptr - kb->kbd_macro_buffer == kb->kbd_macro_bufsize)
5a7f5d07 191 {
08e1d6df
GM
192 int ptr_offset, end_offset, nbytes;
193
194 ptr_offset = kb->kbd_macro_ptr - kb->kbd_macro_buffer;
195 end_offset = kb->kbd_macro_end - kb->kbd_macro_buffer;
196 kb->kbd_macro_bufsize *= 2;
197 nbytes = kb->kbd_macro_bufsize * sizeof *kb->kbd_macro_buffer;
198 kb->kbd_macro_buffer
199 = (Lisp_Object *) xrealloc (kb->kbd_macro_buffer, nbytes);
200 kb->kbd_macro_ptr = kb->kbd_macro_buffer + ptr_offset;
201 kb->kbd_macro_end = kb->kbd_macro_buffer + end_offset;
5a7f5d07 202 }
23751e25 203
08e1d6df 204 *kb->kbd_macro_ptr++ = c;
5a7f5d07
JB
205 }
206}
207
208/* Declare that all chars stored so far in the kbd macro being defined
209 really belong to it. This is done in between editor commands. */
210
c3fd8dd5 211void
5a7f5d07
JB
212finalize_kbd_macro_chars ()
213{
cd8b5aa3 214 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
5a7f5d07 215}
199afd29
RS
216
217DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
218 Scancel_kbd_macro_events, 0, 0, 0,
70da46c3
PJ
219 doc: /* Cancel the events added to a keyboard macro for this command. */)
220 ()
199afd29
RS
221{
222 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
6bbd7a29 223 return Qnil;
199afd29 224}
2d5f65a9
KH
225
226DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
227 Sstore_kbd_macro_event, 1, 1, 0,
70da46c3
PJ
228 doc: /* Store EVENT into the keyboard macro being defined. */)
229 (event)
2d5f65a9
KH
230 Lisp_Object event;
231{
232 store_kbd_macro_char (event);
233 return Qnil;
234}
5a7f5d07
JB
235\f
236DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
f90d3a6b 237 0, 2, "p",
70da46c3
PJ
238 doc: /* Call the last keyboard macro that you defined with \\[start-kbd-macro].
239
240A prefix argument serves as a repeat count. Zero means repeat until error.
241
242To make a macro permanent so you can call it even after
f90d3a6b
KS
243defining others, use \\[name-last-kbd-macro].
244
245In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
246each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
247 (prefix, loopfunc)
248 Lisp_Object prefix, loopfunc;
5a7f5d07 249{
4315204e
RS
250 /* Don't interfere with recognition of the previous command
251 from before this macro started. */
14a18790 252 Vthis_command = current_kboard->Vlast_command;
80184dac
KH
253 /* C-x z after the macro should repeat the macro. */
254 real_this_command = current_kboard->Vlast_kbd_macro;
4315204e 255
cd8b5aa3 256 if (! NILP (current_kboard->defining_kbd_macro))
5a7f5d07 257 error ("Can't execute anonymous macro while defining one");
cd8b5aa3 258 else if (NILP (current_kboard->Vlast_kbd_macro))
5a7f5d07
JB
259 error ("No kbd macro has been defined");
260 else
f90d3a6b 261 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, prefix, loopfunc);
4315204e
RS
262
263 /* command_loop_1 sets this to nil before it returns;
264 get back the last command within the macro
265 so that it can be last, again, after we return. */
14a18790 266 Vthis_command = current_kboard->Vlast_command;
4315204e 267
5a7f5d07
JB
268 return Qnil;
269}
270
271/* Restore Vexecuting_macro and executing_macro_index - called when
272 the unwind-protect in Fexecute_kbd_macro gets invoked. */
d4087e06 273
5a7f5d07
JB
274static Lisp_Object
275pop_kbd_macro (info)
276 Lisp_Object info;
277{
278 Lisp_Object tem;
80184dac
KH
279 Vexecuting_macro = XCAR (info);
280 tem = XCDR (info);
281 executing_macro_index = XINT (XCAR (tem));
282 real_this_command = XCDR (tem);
2136b408 283 Frun_hooks (1, &Qkbd_macro_termination_hook);
5a7f5d07
JB
284 return Qnil;
285}
286
f90d3a6b 287DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 3, 0,
70da46c3
PJ
288 doc: /* Execute MACRO as string of editor command characters.
289If MACRO is a symbol, its function definition is used.
f90d3a6b
KS
290COUNT is a repeat count, or nil for once, or 0 for infinite loop.
291
292Optional third arg LOOPFUNC may be a function that is called prior to
293each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
294 (macro, count, loopfunc)
295 Lisp_Object macro, count, loopfunc;
5a7f5d07
JB
296{
297 Lisp_Object final;
298 Lisp_Object tem;
65b21658 299 int pdlcount = SPECPDL_INDEX ();
5a7f5d07 300 int repeat = 1;
f90d3a6b 301 struct gcpro gcpro1, gcpro2;
d4087e06 302 int success_count = 0;
5a7f5d07 303
4b7da890
KH
304 executing_macro_iterations = 0;
305
1c8c5693
EN
306 if (!NILP (count))
307 {
308 count = Fprefix_numeric_value (count);
309 repeat = XINT (count);
310 }
5a7f5d07 311
502ddf23 312 final = indirect_function (macro);
65346ae6 313 if (!STRINGP (final) && !VECTORP (final))
d86ad277 314 error ("Keyboard macros must be strings or vectors");
5a7f5d07 315
80184dac
KH
316 tem = Fcons (Vexecuting_macro,
317 Fcons (make_number (executing_macro_index),
318 real_this_command));
5a7f5d07
JB
319 record_unwind_protect (pop_kbd_macro, tem);
320
f90d3a6b 321 GCPRO2 (final, loopfunc);
5a7f5d07
JB
322 do
323 {
324 Vexecuting_macro = final;
d4087e06 325 executing_macro = final;
5a7f5d07
JB
326 executing_macro_index = 0;
327
04609ce4 328 current_kboard->Vprefix_arg = Qnil;
f90d3a6b
KS
329
330 if (!NILP (loopfunc))
331 {
332 Lisp_Object cont;
333 cont = call0 (loopfunc);
334 if (NILP (cont))
335 break;
336 }
337
5a7f5d07 338 command_loop_1 ();
e86f81cc 339
d4087e06
RS
340 executing_macro_iterations = ++success_count;
341
e86f81cc 342 QUIT;
5a7f5d07 343 }
65346ae6
KH
344 while (--repeat
345 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
5a7f5d07 346
d4087e06
RS
347 executing_macro = Qnil;
348
b80d5655
RS
349 real_this_command = Vexecuting_macro;
350
5a7f5d07 351 UNGCPRO;
52d9c145 352 return unbind_to (pdlcount, Qnil);
5a7f5d07
JB
353}
354\f
c3fd8dd5 355void
5a7f5d07
JB
356init_macros ()
357{
5a7f5d07 358 Vexecuting_macro = Qnil;
1ab778be 359 executing_macro = Qnil;
5a7f5d07
JB
360}
361
c3fd8dd5 362void
5a7f5d07
JB
363syms_of_macros ()
364{
5a7f5d07
JB
365 Qexecute_kbd_macro = intern ("execute-kbd-macro");
366 staticpro (&Qexecute_kbd_macro);
2136b408
GM
367 Qkbd_macro_termination_hook = intern ("kbd-macro-termination-hook");
368 staticpro (&Qkbd_macro_termination_hook);
5a7f5d07
JB
369
370 defsubr (&Sstart_kbd_macro);
371 defsubr (&Send_kbd_macro);
372 defsubr (&Scall_last_kbd_macro);
373 defsubr (&Sexecute_kbd_macro);
199afd29 374 defsubr (&Scancel_kbd_macro_events);
2d5f65a9 375 defsubr (&Sstore_kbd_macro_event);
5a7f5d07 376
cd8b5aa3 377 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
70da46c3 378 doc: /* Non-nil while a keyboard macro is being defined. Don't set this! */);
5a7f5d07
JB
379
380 DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
70da46c3 381 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
5a7f5d07
JB
382
383 DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
70da46c3 384 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
5a7f5d07 385
cd8b5aa3 386 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
70da46c3 387 doc: /* Last kbd macro defined, as a string or vector; nil if none defined. */);
5a7f5d07 388}