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)
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. */
30 Lisp_Object Qexecute_kbd_macro
, Qkbd_macro_termination_hook
;
32 /* Kbd macro currently being executed (a string or vector). */
34 Lisp_Object Vexecuting_kbd_macro
;
36 /* Index of next character to fetch from that macro. */
38 EMACS_INT executing_kbd_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_kbd_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_kbd_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. */)
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
));
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...");
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
++)
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. */
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
;
143 /* Finish defining the current keyboard macro. */
148 current_kboard
->defining_kbd_macro
= Qnil
;
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
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. */)
170 Lisp_Object repeat
, loopfunc
;
172 if (NILP (current_kboard
->defining_kbd_macro
))
173 error ("Not defining kbd macro");
176 XSETFASTINT (repeat
, 1);
178 CHECK_NUMBER (repeat
);
180 if (!NILP (current_kboard
->defining_kbd_macro
))
183 message ("Keyboard macro defined");
186 if (XFASTINT (repeat
) == 0)
187 Fexecute_kbd_macro (current_kboard
->Vlast_kbd_macro
, repeat
, loopfunc
);
190 XSETINT (repeat
, XINT (repeat
)-1);
191 if (XINT (repeat
) > 0)
192 Fexecute_kbd_macro (current_kboard
->Vlast_kbd_macro
, repeat
, loopfunc
);
197 /* Store character c into kbd macro being defined */
200 store_kbd_macro_char (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
;
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. */
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
;
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. */)
249 store_kbd_macro_char (event
);
253 DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro
, Scall_last_kbd_macro
,
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. */)
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");
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
;
288 /* Restore Vexecuting_kbd_macro and executing_kbd_macro_index.
289 Called when the unwind-protect in Fexecute_kbd_macro gets invoked. */
296 Vexecuting_kbd_macro
= XCAR (info
);
298 executing_kbd_macro_index
= XINT (XCAR (tem
));
299 real_this_command
= XCDR (tem
);
300 Frun_hooks (1, &Qkbd_macro_termination_hook
);
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
;
316 int pdlcount
= SPECPDL_INDEX ();
318 struct gcpro gcpro1
, gcpro2
;
319 int success_count
= 0;
321 executing_kbd_macro_iterations
= 0;
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_kbd_macro
,
334 Fcons (make_number (executing_kbd_macro_index
),
336 record_unwind_protect (pop_kbd_macro
, tem
);
338 GCPRO2 (final
, loopfunc
);
341 Vexecuting_kbd_macro
= final
;
342 executing_kbd_macro
= final
;
343 executing_kbd_macro_index
= 0;
345 current_kboard
->Vprefix_arg
= Qnil
;
347 if (!NILP (loopfunc
))
350 cont
= call0 (loopfunc
);
357 executing_kbd_macro_iterations
= ++success_count
;
362 && (STRINGP (Vexecuting_kbd_macro
) || VECTORP (Vexecuting_kbd_macro
)));
364 executing_kbd_macro
= Qnil
;
366 real_this_command
= Vexecuting_kbd_macro
;
369 return unbind_to (pdlcount
, Qnil
);
375 Vexecuting_kbd_macro
= Qnil
;
376 executing_kbd_macro
= Qnil
;
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!
396 The value is the symbol `append' while appending to the definition of
397 an existing macro. */);
399 DEFVAR_LISP ("executing-kbd-macro", &Vexecuting_kbd_macro
,
400 doc
: /* Currently executing keyboard macro (string or vector).
401 This is nil when not executing a keyboard macro. */);
403 DEFVAR_INT ("executing-kbd-macro-index", &executing_kbd_macro_index
,
404 doc
: /* Index in currently executing keyboard macro; undefined 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) */