(cperl-switch-to-doc-buffer): Don't use interactive-p.
[emacs.git] / src / macros.c
blobd0219a3be0401c8a613e86376563b9b73438a3dd
1 /* Keyboard macros.
2 Copyright (C) 1985, 1986, 1993, 2000, 2001 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 #include <config.h>
23 #include "lisp.h"
24 #include "macros.h"
25 #include "commands.h"
26 #include "buffer.h"
27 #include "window.h"
28 #include "keyboard.h"
30 Lisp_Object Qexecute_kbd_macro, Qkbd_macro_termination_hook;
32 /* Kbd macro currently being executed (a string or vector). */
34 Lisp_Object Vexecuting_macro;
36 /* Index of next character to fetch from that macro. */
38 EMACS_INT executing_macro_index;
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. */
45 int executing_macro_iterations;
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. */
52 Lisp_Object executing_macro;
54 extern Lisp_Object real_this_command;
56 Lisp_Object Fexecute_kbd_macro ();
58 DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 2, "P",
59 doc: /* Record subsequent keyboard input, defining a keyboard macro.
60 The commands are recorded even as they are executed.
61 Use \\[end-kbd-macro] to finish recording and make the macro available.
62 Use \\[name-last-kbd-macro] to give it a permanent name.
63 Non-nil arg (prefix arg) means append to last macro defined;
64 this begins by re-executing that macro as if you typed it again.
65 If optional second arg, NO-EXEC, is non-nil, do not re-execute last
66 macro before appending to it. */)
67 (append, no_exec)
68 Lisp_Object append, no_exec;
70 if (!NILP (current_kboard->defining_kbd_macro))
71 error ("Already defining kbd macro");
73 if (!current_kboard->kbd_macro_buffer)
75 current_kboard->kbd_macro_bufsize = 30;
76 current_kboard->kbd_macro_buffer
77 = (Lisp_Object *)xmalloc (30 * sizeof (Lisp_Object));
79 update_mode_lines++;
80 if (NILP (append))
82 if (current_kboard->kbd_macro_bufsize > 200)
84 current_kboard->kbd_macro_bufsize = 30;
85 current_kboard->kbd_macro_buffer
86 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
87 30 * sizeof (Lisp_Object));
89 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
90 current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
91 message ("Defining kbd macro...");
93 else
95 int i, len;
96 int cvt;
98 /* Check the type of last-kbd-macro in case Lisp code changed it. */
99 if (!STRINGP (current_kboard->Vlast_kbd_macro)
100 && !VECTORP (current_kboard->Vlast_kbd_macro))
101 current_kboard->Vlast_kbd_macro
102 = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro);
104 len = XINT (Flength (current_kboard->Vlast_kbd_macro));
106 /* Copy last-kbd-macro into the buffer, in case the Lisp code
107 has put another macro there. */
108 if (current_kboard->kbd_macro_bufsize < len + 30)
110 current_kboard->kbd_macro_bufsize = len + 30;
111 current_kboard->kbd_macro_buffer
112 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
113 (len + 30) * sizeof (Lisp_Object));
116 /* Must convert meta modifier when copying string to vector. */
117 cvt = STRINGP (current_kboard->Vlast_kbd_macro);
118 for (i = 0; i < len; i++)
120 Lisp_Object c;
121 c = Faref (current_kboard->Vlast_kbd_macro, make_number (i));
122 if (cvt && NATNUMP (c) && (XFASTINT (c) & 0x80))
123 XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
124 current_kboard->kbd_macro_buffer[i] = c;
127 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len;
128 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
130 /* Re-execute the macro we are appending to,
131 for consistency of behavior. */
132 if (NILP (no_exec))
133 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
134 make_number (1), Qnil);
136 message ("Appending to kbd macro...");
138 current_kboard->defining_kbd_macro = Qt;
140 return Qnil;
143 /* Finish defining the current keyboard macro. */
145 void
146 end_kbd_macro ()
148 current_kboard->defining_kbd_macro = Qnil;
149 update_mode_lines++;
150 current_kboard->Vlast_kbd_macro
151 = make_event_array ((current_kboard->kbd_macro_end
152 - current_kboard->kbd_macro_buffer),
153 current_kboard->kbd_macro_buffer);
156 DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",
157 doc: /* Finish defining a keyboard macro.
158 The definition was started by \\[start-kbd-macro].
159 The macro is now available for use via \\[call-last-kbd-macro],
160 or it can be given a name with \\[name-last-kbd-macro] and then invoked
161 under that name.
163 With numeric arg, repeat macro now that many times,
164 counting the definition just completed as the first repetition.
165 An argument of zero means repeat until error.
167 In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
168 each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
169 (repeat, loopfunc)
170 Lisp_Object repeat, loopfunc;
172 if (NILP (current_kboard->defining_kbd_macro))
173 error ("Not defining kbd macro");
175 if (NILP (repeat))
176 XSETFASTINT (repeat, 1);
177 else
178 CHECK_NUMBER (repeat);
180 if (!NILP (current_kboard->defining_kbd_macro))
182 end_kbd_macro ();
183 message ("Keyboard macro defined");
186 if (XFASTINT (repeat) == 0)
187 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
188 else
190 XSETINT (repeat, XINT (repeat)-1);
191 if (XINT (repeat) > 0)
192 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat, loopfunc);
194 return Qnil;
197 /* Store character c into kbd macro being defined */
199 void
200 store_kbd_macro_char (c)
201 Lisp_Object c;
203 struct kboard *kb = current_kboard;
205 if (!NILP (kb->defining_kbd_macro))
207 if (kb->kbd_macro_ptr - kb->kbd_macro_buffer == kb->kbd_macro_bufsize)
209 int ptr_offset, end_offset, nbytes;
211 ptr_offset = kb->kbd_macro_ptr - kb->kbd_macro_buffer;
212 end_offset = kb->kbd_macro_end - kb->kbd_macro_buffer;
213 kb->kbd_macro_bufsize *= 2;
214 nbytes = kb->kbd_macro_bufsize * sizeof *kb->kbd_macro_buffer;
215 kb->kbd_macro_buffer
216 = (Lisp_Object *) xrealloc (kb->kbd_macro_buffer, nbytes);
217 kb->kbd_macro_ptr = kb->kbd_macro_buffer + ptr_offset;
218 kb->kbd_macro_end = kb->kbd_macro_buffer + end_offset;
221 *kb->kbd_macro_ptr++ = c;
225 /* Declare that all chars stored so far in the kbd macro being defined
226 really belong to it. This is done in between editor commands. */
228 void
229 finalize_kbd_macro_chars ()
231 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
234 DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
235 Scancel_kbd_macro_events, 0, 0, 0,
236 doc: /* Cancel the events added to a keyboard macro for this command. */)
239 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
240 return Qnil;
243 DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
244 Sstore_kbd_macro_event, 1, 1, 0,
245 doc: /* Store EVENT into the keyboard macro being defined. */)
246 (event)
247 Lisp_Object event;
249 store_kbd_macro_char (event);
250 return Qnil;
253 DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
254 0, 2, "p",
255 doc: /* Call the last keyboard macro that you defined with \\[start-kbd-macro].
257 A prefix argument serves as a repeat count. Zero means repeat until error.
259 To make a macro permanent so you can call it even after
260 defining others, use \\[name-last-kbd-macro].
262 In Lisp, optional second arg LOOPFUNC may be a function that is called prior to
263 each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
264 (prefix, loopfunc)
265 Lisp_Object prefix, loopfunc;
267 /* Don't interfere with recognition of the previous command
268 from before this macro started. */
269 Vthis_command = current_kboard->Vlast_command;
270 /* C-x z after the macro should repeat the macro. */
271 real_this_command = current_kboard->Vlast_kbd_macro;
273 if (! NILP (current_kboard->defining_kbd_macro))
274 error ("Can't execute anonymous macro while defining one");
275 else if (NILP (current_kboard->Vlast_kbd_macro))
276 error ("No kbd macro has been defined");
277 else
278 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, prefix, loopfunc);
280 /* command_loop_1 sets this to nil before it returns;
281 get back the last command within the macro
282 so that it can be last, again, after we return. */
283 Vthis_command = current_kboard->Vlast_command;
285 return Qnil;
288 /* Restore Vexecuting_macro and executing_macro_index - called when
289 the unwind-protect in Fexecute_kbd_macro gets invoked. */
291 static Lisp_Object
292 pop_kbd_macro (info)
293 Lisp_Object info;
295 Lisp_Object tem;
296 Vexecuting_macro = XCAR (info);
297 tem = XCDR (info);
298 executing_macro_index = XINT (XCAR (tem));
299 real_this_command = XCDR (tem);
300 Frun_hooks (1, &Qkbd_macro_termination_hook);
301 return Qnil;
304 DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 3, 0,
305 doc: /* Execute MACRO as string of editor command characters.
306 If MACRO is a symbol, its function definition is used.
307 COUNT is a repeat count, or nil for once, or 0 for infinite loop.
309 Optional third arg LOOPFUNC may be a function that is called prior to
310 each iteration of the macro. Iteration stops if LOOPFUNC returns nil. */)
311 (macro, count, loopfunc)
312 Lisp_Object macro, count, loopfunc;
314 Lisp_Object final;
315 Lisp_Object tem;
316 int pdlcount = SPECPDL_INDEX ();
317 int repeat = 1;
318 struct gcpro gcpro1, gcpro2;
319 int success_count = 0;
321 executing_macro_iterations = 0;
323 if (!NILP (count))
325 count = Fprefix_numeric_value (count);
326 repeat = XINT (count);
329 final = indirect_function (macro);
330 if (!STRINGP (final) && !VECTORP (final))
331 error ("Keyboard macros must be strings or vectors");
333 tem = Fcons (Vexecuting_macro,
334 Fcons (make_number (executing_macro_index),
335 real_this_command));
336 record_unwind_protect (pop_kbd_macro, tem);
338 GCPRO2 (final, loopfunc);
341 Vexecuting_macro = final;
342 executing_macro = final;
343 executing_macro_index = 0;
345 current_kboard->Vprefix_arg = Qnil;
347 if (!NILP (loopfunc))
349 Lisp_Object cont;
350 cont = call0 (loopfunc);
351 if (NILP (cont))
352 break;
355 command_loop_1 ();
357 executing_macro_iterations = ++success_count;
359 QUIT;
361 while (--repeat
362 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
364 executing_macro = Qnil;
366 real_this_command = Vexecuting_macro;
368 UNGCPRO;
369 return unbind_to (pdlcount, Qnil);
372 void
373 init_macros ()
375 Vexecuting_macro = Qnil;
376 executing_macro = Qnil;
379 void
380 syms_of_macros ()
382 Qexecute_kbd_macro = intern ("execute-kbd-macro");
383 staticpro (&Qexecute_kbd_macro);
384 Qkbd_macro_termination_hook = intern ("kbd-macro-termination-hook");
385 staticpro (&Qkbd_macro_termination_hook);
387 defsubr (&Sstart_kbd_macro);
388 defsubr (&Send_kbd_macro);
389 defsubr (&Scall_last_kbd_macro);
390 defsubr (&Sexecute_kbd_macro);
391 defsubr (&Scancel_kbd_macro_events);
392 defsubr (&Sstore_kbd_macro_event);
394 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
395 doc: /* Non-nil while a keyboard macro is being defined. Don't set this! */);
397 DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
398 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
400 DEFVAR_INT ("executing-macro-index", &executing_macro_index,
401 doc: /* Index in currently executing keyboard macro; undefined if none executing. */);
403 DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
404 doc: /* Currently executing keyboard macro (string or vector); nil if none executing. */);
406 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
407 doc: /* Last kbd macro defined, as a string or vector; nil if none defined. */);
410 /* arch-tag: d293fcc9-2266-4163-9198-7fa0de12ec9e
411 (do not change this comment) */