Mercurial > emacs
annotate src/macros.c @ 23323:0800a4f84757
(underlying_strftime):
Set the buffer to a nonzero value before calling
strftime, and check to see whether strftime has set the buffer to zero.
This lets us distinguish between an empty buffer and an error.
I'm installing this patch by hand now; it will be superseded whenever
the glibc sources are propagated back to fsf.org.
| author | Paul Eggert <eggert@twinsun.com> |
|---|---|
| date | Fri, 25 Sep 1998 21:40:23 +0000 |
| parents | edcf24874ef5 |
| children | 1dd05eb0443d |
| rev | line source |
|---|---|
| 246 | 1 /* Keyboard macros. |
| 2961 | 2 Copyright (C) 1985, 1986, 1993 Free Software Foundation, Inc. |
| 246 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 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 | |
| 647 | 8 the Free Software Foundation; either version 2, or (at your option) |
| 246 | 9 any later version. |
| 10 | |
| 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. | |
| 15 | |
| 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 | |
|
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 | 20 |
| 21 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
2961
diff
changeset
|
22 #include <config.h> |
| 246 | 23 #include "lisp.h" |
| 24 #include "macros.h" | |
| 25 #include "commands.h" | |
| 26 #include "buffer.h" | |
| 27 #include "window.h" | |
| 11341 | 28 #include "keyboard.h" |
| 246 | 29 |
| 30 Lisp_Object Qexecute_kbd_macro; | |
| 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 | 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 | 38 int executing_macro_index; |
| 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 |
| 246 | 54 Lisp_Object Fexecute_kbd_macro (); |
| 55 | |
| 56 DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P", | |
| 57 "Record subsequent keyboard input, defining a keyboard macro.\n\ | |
| 58 The commands are recorded even as they are executed.\n\ | |
| 59 Use \\[end-kbd-macro] to finish recording and make the macro available.\n\ | |
| 60 Use \\[name-last-kbd-macro] to give it a permanent name.\n\ | |
| 61 Non-nil arg (prefix arg) means append to last macro defined;\n\ | |
| 62 This begins by re-executing that macro as if you typed it again.") | |
| 63 (append) | |
| 64 Lisp_Object append; | |
| 65 { | |
| 11009 | 66 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 67 error ("Already defining kbd macro"); |
| 68 | |
| 11009 | 69 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
|
70 { |
| 11009 | 71 current_kboard->kbd_macro_bufsize = 30; |
| 72 current_kboard->kbd_macro_buffer | |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
73 = (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
|
74 } |
| 246 | 75 update_mode_lines++; |
| 485 | 76 if (NILP (append)) |
| 246 | 77 { |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
78 if (current_kboard->kbd_macro_bufsize > 200) |
|
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
79 { |
|
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
80 current_kboard->kbd_macro_bufsize = 30; |
|
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
81 current_kboard->kbd_macro_buffer |
|
15223
be1bc5b3f14e
(Fstart_kbd_macro): Add missing xrealloc arg.
Karl Heuer <kwzh@gnu.org>
parents:
14301
diff
changeset
|
82 = (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
|
83 30 * sizeof (Lisp_Object)); |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
84 } |
| 11009 | 85 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer; |
| 86 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
|
87 message ("Defining kbd macro..."); |
| 246 | 88 } |
| 89 else | |
| 90 { | |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
91 message ("Appending to kbd macro..."); |
| 11009 | 92 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; |
| 93 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
|
94 make_number (1)); |
| 246 | 95 } |
| 11009 | 96 current_kboard->defining_kbd_macro = Qt; |
| 246 | 97 |
| 98 return Qnil; | |
| 99 } | |
| 100 | |
| 101 DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 1, "p", | |
| 102 "Finish defining a keyboard macro.\n\ | |
| 103 The definition was started by \\[start-kbd-macro].\n\ | |
| 104 The macro is now available for use via \\[call-last-kbd-macro],\n\ | |
| 105 or it can be given a name with \\[name-last-kbd-macro] and then invoked\n\ | |
| 106 under that name.\n\ | |
| 107 \n\ | |
| 108 With numeric arg, repeat macro now that many times,\n\ | |
| 109 counting the definition just completed as the first repetition.\n\ | |
| 110 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
|
111 (repeat) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
112 Lisp_Object repeat; |
| 246 | 113 { |
| 11009 | 114 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
|
115 error ("Not defining kbd macro"); |
| 246 | 116 |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
117 if (NILP (repeat)) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
118 XSETFASTINT (repeat, 1); |
| 246 | 119 else |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
120 CHECK_NUMBER (repeat, 0); |
| 246 | 121 |
| 11009 | 122 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 123 { |
| 11009 | 124 current_kboard->defining_kbd_macro = Qnil; |
| 246 | 125 update_mode_lines++; |
| 11009 | 126 current_kboard->Vlast_kbd_macro |
| 127 = make_event_array ((current_kboard->kbd_macro_end | |
| 128 - current_kboard->kbd_macro_buffer), | |
| 129 current_kboard->kbd_macro_buffer); | |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
130 message ("Keyboard macro defined"); |
| 246 | 131 } |
| 132 | |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
133 if (XFASTINT (repeat) == 0) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
134 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat); |
| 246 | 135 else |
| 136 { | |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
137 XSETINT (repeat, XINT (repeat)-1); |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
138 if (XINT (repeat) > 0) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
139 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat); |
| 246 | 140 } |
| 141 return Qnil; | |
| 142 } | |
| 143 | |
| 144 /* Store character c into kbd macro being defined */ | |
| 145 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
146 void |
| 246 | 147 store_kbd_macro_char (c) |
| 148 Lisp_Object c; | |
| 149 { | |
| 11009 | 150 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 151 { |
| 11009 | 152 if ((current_kboard->kbd_macro_ptr |
| 153 - current_kboard->kbd_macro_buffer) | |
| 154 == current_kboard->kbd_macro_bufsize) | |
| 246 | 155 { |
|
10910
b0edc245c9b7
(defining_kbd_macro): Delete; now part of perdisplay. All uses changed.
Karl Heuer <kwzh@gnu.org>
parents:
10856
diff
changeset
|
156 register Lisp_Object *new; |
| 11009 | 157 current_kboard->kbd_macro_bufsize *= 2; |
| 158 new = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer, | |
| 159 (current_kboard->kbd_macro_bufsize | |
|
10910
b0edc245c9b7
(defining_kbd_macro): Delete; now part of perdisplay. All uses changed.
Karl Heuer <kwzh@gnu.org>
parents:
10856
diff
changeset
|
160 * sizeof (Lisp_Object))); |
| 11009 | 161 current_kboard->kbd_macro_ptr |
| 162 += new - current_kboard->kbd_macro_buffer; | |
| 163 current_kboard->kbd_macro_end | |
| 164 += new - current_kboard->kbd_macro_buffer; | |
| 165 current_kboard->kbd_macro_buffer = new; | |
| 246 | 166 } |
| 11009 | 167 *current_kboard->kbd_macro_ptr++ = c; |
| 246 | 168 } |
| 169 } | |
| 170 | |
| 171 /* Declare that all chars stored so far in the kbd macro being defined | |
| 172 really belong to it. This is done in between editor commands. */ | |
| 173 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
174 void |
| 246 | 175 finalize_kbd_macro_chars () |
| 176 { | |
| 11009 | 177 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr; |
| 246 | 178 } |
|
12845
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
179 |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
180 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
|
181 Scancel_kbd_macro_events, 0, 0, 0, |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
182 "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
|
183 () |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
184 { |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
185 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
186 } |
|
13773
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
187 |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
188 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
|
189 Sstore_kbd_macro_event, 1, 1, 0, |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
190 "Store EVENT into the keyboard macro being defined.") |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
191 (event) |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
192 Lisp_Object event; |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
193 { |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
194 store_kbd_macro_char (event); |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
195 return Qnil; |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
196 } |
| 246 | 197 |
| 198 DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro, | |
| 199 0, 1, "p", | |
| 200 "Call the last keyboard macro that you defined with \\[start-kbd-macro].\n\ | |
| 201 \n\ | |
| 202 A prefix argument serves as a repeat count. Zero means repeat until error.\n\ | |
| 203 \n\ | |
| 204 To make a macro permanent so you can call it even after\n\ | |
| 205 defining others, use \\[name-last-kbd-macro].") | |
| 206 (prefix) | |
| 207 Lisp_Object prefix; | |
| 208 { | |
|
16562
4999fc12564e
(Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents:
15976
diff
changeset
|
209 /* 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
|
210 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
|
211 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
|
212 |
| 11009 | 213 if (! NILP (current_kboard->defining_kbd_macro)) |
| 246 | 214 error ("Can't execute anonymous macro while defining one"); |
| 11009 | 215 else if (NILP (current_kboard->Vlast_kbd_macro)) |
| 246 | 216 error ("No kbd macro has been defined"); |
| 217 else | |
| 11009 | 218 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
|
219 |
|
4999fc12564e
(Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents:
15976
diff
changeset
|
220 /* 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
|
221 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
|
222 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
|
223 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
|
224 |
| 246 | 225 return Qnil; |
| 226 } | |
| 227 | |
| 228 /* Restore Vexecuting_macro and executing_macro_index - called when | |
| 229 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
|
230 |
| 246 | 231 static Lisp_Object |
| 232 pop_kbd_macro (info) | |
| 233 Lisp_Object info; | |
| 234 { | |
| 235 Lisp_Object tem; | |
| 236 Vexecuting_macro = Fcar (info); | |
| 237 tem = Fcdr (info); | |
| 238 executing_macro_index = XINT (tem); | |
| 239 return Qnil; | |
| 240 } | |
| 241 | |
| 242 DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 2, 0, | |
| 243 "Execute MACRO as string of editor command characters.\n\ | |
| 244 If MACRO is a symbol, its function definition is used.\n\ | |
| 245 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
|
246 (macro, count) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
247 Lisp_Object macro, count; |
| 246 | 248 { |
| 249 Lisp_Object final; | |
| 250 Lisp_Object tem; | |
|
14094
e5e4fe8e968f
(Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents:
14081
diff
changeset
|
251 int pdlcount = specpdl_ptr - specpdl; |
| 246 | 252 int repeat = 1; |
| 253 struct gcpro gcpro1; | |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
254 int success_count = 0; |
| 246 | 255 |
|
14100
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
256 if (!NILP (count)) |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
257 { |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
258 count = Fprefix_numeric_value (count); |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
259 repeat = XINT (count); |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
260 } |
| 246 | 261 |
| 647 | 262 final = indirect_function (macro); |
|
9122
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
263 if (!STRINGP (final) && !VECTORP (final)) |
|
22915
ef9dd93e3077
(Fexecute_kbd_macro): Fix error message.
Richard M. Stallman <rms@gnu.org>
parents:
20299
diff
changeset
|
264 error ("Keyboard macros must be strings or vectors"); |
| 246 | 265 |
|
9314
2c681685646b
(Fend_kbd_macro, Fexecute_kbd_macro): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9122
diff
changeset
|
266 XSETFASTINT (tem, executing_macro_index); |
| 246 | 267 tem = Fcons (Vexecuting_macro, tem); |
| 268 record_unwind_protect (pop_kbd_macro, tem); | |
| 269 | |
| 270 GCPRO1 (final); | |
| 271 do | |
| 272 { | |
| 273 Vexecuting_macro = final; | |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
274 executing_macro = final; |
| 246 | 275 executing_macro_index = 0; |
| 276 | |
|
12119
d7b51659a56d
(Fexecute_kbd_macro): Vprefix_arg is now part of kboard.
Karl Heuer <kwzh@gnu.org>
parents:
11341
diff
changeset
|
277 current_kboard->Vprefix_arg = Qnil; |
| 246 | 278 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
|
279 |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
280 executing_macro_iterations = ++success_count; |
|
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
281 |
|
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
|
282 QUIT; |
| 246 | 283 } |
|
9122
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
284 while (--repeat |
|
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
285 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro))); |
| 246 | 286 |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
287 executing_macro = Qnil; |
|
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
288 |
| 246 | 289 UNGCPRO; |
|
14094
e5e4fe8e968f
(Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents:
14081
diff
changeset
|
290 return unbind_to (pdlcount, Qnil); |
| 246 | 291 } |
| 292 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
293 void |
| 246 | 294 init_macros () |
| 295 { | |
| 296 Vexecuting_macro = Qnil; | |
|
15976
e6d654e1fa2a
(init_macros): Initialize executing_macro, too.
Erik Naggum <erik@naggum.no>
parents:
15968
diff
changeset
|
297 executing_macro = Qnil; |
| 246 | 298 } |
| 299 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
300 void |
| 246 | 301 syms_of_macros () |
| 302 { | |
| 303 Qexecute_kbd_macro = intern ("execute-kbd-macro"); | |
| 304 staticpro (&Qexecute_kbd_macro); | |
| 305 | |
| 306 defsubr (&Sstart_kbd_macro); | |
| 307 defsubr (&Send_kbd_macro); | |
| 308 defsubr (&Scall_last_kbd_macro); | |
| 309 defsubr (&Sexecute_kbd_macro); | |
|
12845
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
310 defsubr (&Scancel_kbd_macro_events); |
|
13773
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
311 defsubr (&Sstore_kbd_macro_event); |
| 246 | 312 |
| 11009 | 313 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro, |
| 246 | 314 "Non-nil while a keyboard macro is being defined. Don't set this!"); |
| 315 | |
| 316 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
|
317 "Currently executing keyboard macro (string or vector); nil if none executing."); |
| 246 | 318 |
| 319 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
|
320 "Currently executing keyboard macro (string or vector); nil if none executing."); |
| 246 | 321 |
| 11009 | 322 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
|
323 "Last kbd macro defined, as a string or vector; nil if none defined."); |
| 246 | 324 } |
| 325 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
326 void |
| 246 | 327 keys_of_macros () |
| 328 { | |
| 329 initial_define_key (control_x_map, ('e'), "call-last-kbd-macro"); | |
| 330 initial_define_key (control_x_map, ('('), "start-kbd-macro"); | |
| 331 initial_define_key (control_x_map, (')'), "end-kbd-macro"); | |
| 332 } |
