annotate src/macros.c @ 38588:08a4c6c00af0

(init_from_display_pos): If POS is in an overlay string, deal with the first overlay string having an image `display' property. (try_window_reusing_current_matrix, compute_line_metrics): Fix computation of row's visible height for the case that part of the row is invisible above and part of the row is at the same time invisible below the window.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 27 Jul 2001 15:29:16 +0000
parents cea256f04f86
children 73d05c66ef70
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* Keyboard macros.
35119
97a19f647a12 (Qkbd_macro_termination_hook): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 34361
diff changeset
2 Copyright (C) 1985, 1986, 1993, 2000, 2001 Free Software Foundation, Inc.
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
647
529171c8b71c entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14100
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14100
diff changeset
19 Boston, MA 02111-1307, USA. */
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 2961
diff changeset
22 #include <config.h>
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 #include "lisp.h"
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 #include "macros.h"
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 #include "commands.h"
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 #include "buffer.h"
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 #include "window.h"
11341
e0f3fa4e7bf3 Include keyboard.h.
Richard M. Stallman <rms@gnu.org>
parents: 11009
diff changeset
28 #include "keyboard.h"
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29
35119
97a19f647a12 (Qkbd_macro_termination_hook): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 34361
diff changeset
30 Lisp_Object Qexecute_kbd_macro, Qkbd_macro_termination_hook;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
32 /* Kbd macro currently being executed (a string or vector). */
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
33
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 Lisp_Object Vexecuting_macro;
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
35
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
36 /* Index of next character to fetch from that macro. */
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
37
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 int executing_macro_index;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
40 /* Number of successful iterations so far
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
41 for innermost keyboard macro.
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
42 This is not bound at each level,
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
43 so after an error, it describes the innermost interrupted macro. */
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
44
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
45 int executing_macro_iterations;
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
46
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
47 /* This is the macro that was executing.
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
48 This is not bound at each level,
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
49 so after an error, it describes the innermost interrupted macro.
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
50 We use it only as a kind of flag, so no need to protect it. */
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
51
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
52 Lisp_Object executing_macro;
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
53
23434
1dd05eb0443d (Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents: 22968
diff changeset
54 extern Lisp_Object real_this_command;
1dd05eb0443d (Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents: 22968
diff changeset
55
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 Lisp_Object Fexecute_kbd_macro ();
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P",
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 "Record subsequent keyboard input, defining a keyboard macro.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 The commands are recorded even as they are executed.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 Use \\[end-kbd-macro] to finish recording and make the macro available.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 Use \\[name-last-kbd-macro] to give it a permanent name.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 Non-nil arg (prefix arg) means append to last macro defined;\n\
37926
cea256f04f86 (Fstart_kbd_macro): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 35119
diff changeset
64 this begins by re-executing that macro as if you typed it again.")
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 (append)
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 Lisp_Object append;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
68 if (!NILP (current_kboard->defining_kbd_macro))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 error ("Already defining kbd macro");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
71 if (!current_kboard->kbd_macro_buffer)
10910
b0edc245c9b7 (defining_kbd_macro): Delete; now part of perdisplay. All uses changed.
Karl Heuer <kwzh@gnu.org>
parents: 10856
diff changeset
72 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
73 current_kboard->kbd_macro_bufsize = 30;
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
74 current_kboard->kbd_macro_buffer
14301
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
75 = (Lisp_Object *)xmalloc (30 * sizeof (Lisp_Object));
10910
b0edc245c9b7 (defining_kbd_macro): Delete; now part of perdisplay. All uses changed.
Karl Heuer <kwzh@gnu.org>
parents: 10856
diff changeset
76 }
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 update_mode_lines++;
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 434
diff changeset
78 if (NILP (append))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 {
14301
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
80 if (current_kboard->kbd_macro_bufsize > 200)
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
81 {
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
82 current_kboard->kbd_macro_bufsize = 30;
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
83 current_kboard->kbd_macro_buffer
15223
be1bc5b3f14e (Fstart_kbd_macro): Add missing xrealloc arg.
Karl Heuer <kwzh@gnu.org>
parents: 14301
diff changeset
84 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
be1bc5b3f14e (Fstart_kbd_macro): Add missing xrealloc arg.
Karl Heuer <kwzh@gnu.org>
parents: 14301
diff changeset
85 30 * sizeof (Lisp_Object));
14301
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
86 }
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
87 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
88 current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
14301
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
89 message ("Defining kbd macro...");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 else
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 {
26825
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
93 int i, len;
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
94
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
95 /* Check the type of last-kbd-macro in case Lisp code changed it. */
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
96 if (!STRINGP (current_kboard->Vlast_kbd_macro)
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
97 && !VECTORP (current_kboard->Vlast_kbd_macro))
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
98 current_kboard->Vlast_kbd_macro
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
99 = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro);
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
100
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
101 len = XINT (Flength (current_kboard->Vlast_kbd_macro));
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
102
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
103 /* Copy last-kbd-macro into the buffer, in case the Lisp code
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
104 has put another macro there. */
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
105 if (current_kboard->kbd_macro_bufsize < len + 30)
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
106 {
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
107 current_kboard->kbd_macro_bufsize = len + 30;
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
108 current_kboard->kbd_macro_buffer
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
109 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
110 (len + 30) * sizeof (Lisp_Object));
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
111 }
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
112 for (i = 0; i < len; i++)
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
113 current_kboard->kbd_macro_buffer[i]
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
114 = Faref (current_kboard->Vlast_kbd_macro, make_number (i));
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
115
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
116 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len;
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
117 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
118
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
119 /* Re-execute the macro we are appending to,
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
120 for consistency of behavior. */
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
121 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
10935
73b02c08f17d (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
Karl Heuer <kwzh@gnu.org>
parents: 10910
diff changeset
122 make_number (1));
26825
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
123
66dfce1feb9c (Fstart_kbd_macro): Handle case where last-kbd-macro
Richard M. Stallman <rms@gnu.org>
parents: 24530
diff changeset
124 message ("Appending to kbd macro...");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 }
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
126 current_kboard->defining_kbd_macro = Qt;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 return Qnil;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 1, "p",
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 "Finish defining a keyboard macro.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133 The definition was started by \\[start-kbd-macro].\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 The macro is now available for use via \\[call-last-kbd-macro],\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 or it can be given a name with \\[name-last-kbd-macro] and then invoked\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 under that name.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 \n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 With numeric arg, repeat macro now that many times,\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 counting the definition just completed as the first repetition.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 An argument of zero means repeat until error.")
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
141 (repeat)
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
142 Lisp_Object repeat;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
144 if (NILP (current_kboard->defining_kbd_macro))
22915
ef9dd93e3077 (Fexecute_kbd_macro): Fix error message.
Richard M. Stallman <rms@gnu.org>
parents: 20299
diff changeset
145 error ("Not defining kbd macro");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
147 if (NILP (repeat))
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
148 XSETFASTINT (repeat, 1);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 else
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
150 CHECK_NUMBER (repeat, 0);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
151
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
152 if (!NILP (current_kboard->defining_kbd_macro))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
154 current_kboard->defining_kbd_macro = Qnil;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 update_mode_lines++;
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
156 current_kboard->Vlast_kbd_macro
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
157 = make_event_array ((current_kboard->kbd_macro_end
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
158 - current_kboard->kbd_macro_buffer),
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
159 current_kboard->kbd_macro_buffer);
14301
621f53083d60 * macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents: 14186
diff changeset
160 message ("Keyboard macro defined");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
163 if (XFASTINT (repeat) == 0)
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
164 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 else
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 {
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
167 XSETINT (repeat, XINT (repeat)-1);
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
168 if (XINT (repeat) > 0)
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
169 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 return Qnil;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 /* Store character c into kbd macro being defined */
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175
20299
608c1a9aefc8 (store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents: 16562
diff changeset
176 void
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 store_kbd_macro_char (c)
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 Lisp_Object c;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
180 if (!NILP (current_kboard->defining_kbd_macro))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
182 if ((current_kboard->kbd_macro_ptr
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
183 - current_kboard->kbd_macro_buffer)
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
184 == current_kboard->kbd_macro_bufsize)
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 {
34361
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
186 int offset = (current_kboard->kbd_macro_ptr
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
187 - current_kboard->kbd_macro_buffer);
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
188 current_kboard->kbd_macro_bufsize *= 2;
34361
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
189 current_kboard->kbd_macro_buffer
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
190 = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
191 (current_kboard->kbd_macro_bufsize
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
192 * sizeof (Lisp_Object)));
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
193 current_kboard->kbd_macro_ptr
34361
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
194 = current_kboard->kbd_macro_buffer + offset;
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
195 current_kboard->kbd_macro_end
34361
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
196 = (current_kboard->kbd_macro_buffer
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
197 + current_kboard->kbd_macro_bufsize);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 }
34361
385981407528 (store_kbd_macro_char): Change the way buffers are
Gerd Moellmann <gerd@gnu.org>
parents: 31829
diff changeset
199
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
200 *current_kboard->kbd_macro_ptr++ = c;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 /* Declare that all chars stored so far in the kbd macro being defined
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 really belong to it. This is done in between editor commands. */
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206
20299
608c1a9aefc8 (store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents: 16562
diff changeset
207 void
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 finalize_kbd_macro_chars ()
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 {
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
210 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 }
12845
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
212
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
213 DEFUN ("cancel-kbd-macro-events", Fcancel_kbd_macro_events,
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
214 Scancel_kbd_macro_events, 0, 0, 0,
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
215 "Cancel the events added to a keyboard macro for this command.")
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
216 ()
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
217 {
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
218 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
31829
43566b0aec59 Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents: 26825
diff changeset
219 return Qnil;
12845
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
220 }
13773
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
221
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
222 DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
223 Sstore_kbd_macro_event, 1, 1, 0,
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
224 "Store EVENT into the keyboard macro being defined.")
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
225 (event)
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
226 Lisp_Object event;
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
227 {
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
228 store_kbd_macro_char (event);
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
229 return Qnil;
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
230 }
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 0, 1, "p",
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 "Call the last keyboard macro that you defined with \\[start-kbd-macro].\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 \n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 A prefix argument serves as a repeat count. Zero means repeat until error.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 \n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 To make a macro permanent so you can call it even after\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 defining others, use \\[name-last-kbd-macro].")
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 (prefix)
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 Lisp_Object prefix;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 {
16562
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
243 /* Don't interfere with recognition of the previous command
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
244 from before this macro started. */
22968
edcf24874ef5 (Fcall_last_kbd_macro): this_command renamed to Vthis_command.
Richard M. Stallman <rms@gnu.org>
parents: 22915
diff changeset
245 Vthis_command = current_kboard->Vlast_command;
24530
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
246 /* C-x z after the macro should repeat the macro. */
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
247 real_this_command = current_kboard->Vlast_kbd_macro;
16562
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
248
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
249 if (! NILP (current_kboard->defining_kbd_macro))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 error ("Can't execute anonymous macro while defining one");
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
251 else if (NILP (current_kboard->Vlast_kbd_macro))
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 error ("No kbd macro has been defined");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 else
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
254 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, prefix);
16562
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
255
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
256 /* command_loop_1 sets this to nil before it returns;
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
257 get back the last command within the macro
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
258 so that it can be last, again, after we return. */
22968
edcf24874ef5 (Fcall_last_kbd_macro): this_command renamed to Vthis_command.
Richard M. Stallman <rms@gnu.org>
parents: 22915
diff changeset
259 Vthis_command = current_kboard->Vlast_command;
16562
4999fc12564e (Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents: 15976
diff changeset
260
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 return Qnil;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 /* Restore Vexecuting_macro and executing_macro_index - called when
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 the unwind-protect in Fexecute_kbd_macro gets invoked. */
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
266
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 static Lisp_Object
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 pop_kbd_macro (info)
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 Lisp_Object info;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 Lisp_Object tem;
24530
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
272 Vexecuting_macro = XCAR (info);
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
273 tem = XCDR (info);
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
274 executing_macro_index = XINT (XCAR (tem));
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
275 real_this_command = XCDR (tem);
35119
97a19f647a12 (Qkbd_macro_termination_hook): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 34361
diff changeset
276 Frun_hooks (1, &Qkbd_macro_termination_hook);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 return Qnil;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 2, 0,
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 "Execute MACRO as string of editor command characters.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 If MACRO is a symbol, its function definition is used.\n\
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
14081
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
284 (macro, count)
addc50fc3981 (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents: 13773
diff changeset
285 Lisp_Object macro, count;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 Lisp_Object final;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 Lisp_Object tem;
14094
e5e4fe8e968f (Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents: 14081
diff changeset
289 int pdlcount = specpdl_ptr - specpdl;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 int repeat = 1;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 struct gcpro gcpro1;
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
292 int success_count = 0;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293
24482
9b722e922325 (Fexecute_kbd_macro): Initialize executing_macro_iterations at beginning.
Karl Heuer <kwzh@gnu.org>
parents: 23434
diff changeset
294 executing_macro_iterations = 0;
9b722e922325 (Fexecute_kbd_macro): Initialize executing_macro_iterations at beginning.
Karl Heuer <kwzh@gnu.org>
parents: 23434
diff changeset
295
14100
0950fefc4bd1 (Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents: 14094
diff changeset
296 if (!NILP (count))
0950fefc4bd1 (Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents: 14094
diff changeset
297 {
0950fefc4bd1 (Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents: 14094
diff changeset
298 count = Fprefix_numeric_value (count);
0950fefc4bd1 (Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents: 14094
diff changeset
299 repeat = XINT (count);
0950fefc4bd1 (Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents: 14094
diff changeset
300 }
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301
647
529171c8b71c entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
302 final = indirect_function (macro);
9122
9ba3f17d6631 (Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 4696
diff changeset
303 if (!STRINGP (final) && !VECTORP (final))
22915
ef9dd93e3077 (Fexecute_kbd_macro): Fix error message.
Richard M. Stallman <rms@gnu.org>
parents: 20299
diff changeset
304 error ("Keyboard macros must be strings or vectors");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305
24530
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
306 tem = Fcons (Vexecuting_macro,
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
307 Fcons (make_number (executing_macro_index),
14cc75ebfd7b (Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents: 24482
diff changeset
308 real_this_command));
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 record_unwind_protect (pop_kbd_macro, tem);
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 GCPRO1 (final);
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 do
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 Vexecuting_macro = final;
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
315 executing_macro = final;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 executing_macro_index = 0;
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317
12119
d7b51659a56d (Fexecute_kbd_macro): Vprefix_arg is now part of kboard.
Karl Heuer <kwzh@gnu.org>
parents: 11341
diff changeset
318 current_kboard->Vprefix_arg = Qnil;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 command_loop_1 ();
1682
af0995b9b142 * macros.c (Fend_kbd_macro): Don't use XFASTINT to check if arg is
Jim Blandy <jimb@redhat.com>
parents: 647
diff changeset
320
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
321 executing_macro_iterations = ++success_count;
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
322
1682
af0995b9b142 * macros.c (Fend_kbd_macro): Don't use XFASTINT to check if arg is
Jim Blandy <jimb@redhat.com>
parents: 647
diff changeset
323 QUIT;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 }
9122
9ba3f17d6631 (Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 4696
diff changeset
325 while (--repeat
9ba3f17d6631 (Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 4696
diff changeset
326 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)));
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327
15968
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
328 executing_macro = Qnil;
231e14e38946 (executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents: 15223
diff changeset
329
23434
1dd05eb0443d (Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents: 22968
diff changeset
330 real_this_command = Vexecuting_macro;
1dd05eb0443d (Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents: 22968
diff changeset
331
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 UNGCPRO;
14094
e5e4fe8e968f (Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents: 14081
diff changeset
333 return unbind_to (pdlcount, Qnil);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335
20299
608c1a9aefc8 (store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents: 16562
diff changeset
336 void
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 init_macros ()
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 Vexecuting_macro = Qnil;
15976
e6d654e1fa2a (init_macros): Initialize executing_macro, too.
Erik Naggum <erik@naggum.no>
parents: 15968
diff changeset
340 executing_macro = Qnil;
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342
20299
608c1a9aefc8 (store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents: 16562
diff changeset
343 void
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344 syms_of_macros ()
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 Qexecute_kbd_macro = intern ("execute-kbd-macro");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 staticpro (&Qexecute_kbd_macro);
35119
97a19f647a12 (Qkbd_macro_termination_hook): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 34361
diff changeset
348 Qkbd_macro_termination_hook = intern ("kbd-macro-termination-hook");
97a19f647a12 (Qkbd_macro_termination_hook): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 34361
diff changeset
349 staticpro (&Qkbd_macro_termination_hook);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351 defsubr (&Sstart_kbd_macro);
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 defsubr (&Send_kbd_macro);
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 defsubr (&Scall_last_kbd_macro);
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 defsubr (&Sexecute_kbd_macro);
12845
9ee2045cda62 (Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents: 12119
diff changeset
355 defsubr (&Scancel_kbd_macro_events);
13773
7d50ac085b12 (Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents: 12845
diff changeset
356 defsubr (&Sstore_kbd_macro_event);
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
358 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359 "Non-nil while a keyboard macro is being defined. Don't set this!");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
10935
73b02c08f17d (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
Karl Heuer <kwzh@gnu.org>
parents: 10910
diff changeset
362 "Currently executing keyboard macro (string or vector); nil if none executing.");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
10935
73b02c08f17d (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
Karl Heuer <kwzh@gnu.org>
parents: 10910
diff changeset
365 "Currently executing keyboard macro (string or vector); nil if none executing.");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366
11009
399469e5eb5b Rename perdisplay to kboard.
Karl Heuer <kwzh@gnu.org>
parents: 10992
diff changeset
367 DEFVAR_KBOARD ("last-kbd-macro", Vlast_kbd_macro,
10935
73b02c08f17d (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
Karl Heuer <kwzh@gnu.org>
parents: 10910
diff changeset
368 "Last kbd macro defined, as a string or vector; nil if none defined.");
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 }
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370
20299
608c1a9aefc8 (store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents: 16562
diff changeset
371 void
246
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 keys_of_macros ()
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 {
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 initial_define_key (control_x_map, ('e'), "call-last-kbd-macro");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 initial_define_key (control_x_map, ('('), "start-kbd-macro");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 initial_define_key (control_x_map, (')'), "end-kbd-macro");
81e375c3eb58 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 }