Mercurial > emacs
annotate src/macros.c @ 25427:dde5fcbfa2af
(Info-tagify): Don't insert more than one newline before the tag table.
(Info-tagify): Start by widening.
Match node headers that don't list the file name,
and more kinds of page separations.
Strip properties during tagification.
Use start of node header line as tag's position.
Fix the "done" message.
(Info-validate): Save and restore match data around narrowing down.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sun, 29 Aug 1999 19:19:00 +0000 |
| parents | 14cc75ebfd7b |
| children | 66dfce1feb9c |
| 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 |
|
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 | 56 Lisp_Object Fexecute_kbd_macro (); |
| 57 | |
| 58 DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P", | |
| 59 "Record subsequent keyboard input, defining a keyboard macro.\n\ | |
| 60 The commands are recorded even as they are executed.\n\ | |
| 61 Use \\[end-kbd-macro] to finish recording and make the macro available.\n\ | |
| 62 Use \\[name-last-kbd-macro] to give it a permanent name.\n\ | |
| 63 Non-nil arg (prefix arg) means append to last macro defined;\n\ | |
| 64 This begins by re-executing that macro as if you typed it again.") | |
| 65 (append) | |
| 66 Lisp_Object append; | |
| 67 { | |
| 11009 | 68 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 69 error ("Already defining kbd macro"); |
| 70 | |
| 11009 | 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 | 73 current_kboard->kbd_macro_bufsize = 30; |
| 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 | 77 update_mode_lines++; |
| 485 | 78 if (NILP (append)) |
| 246 | 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 | 87 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer; |
| 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 | 90 } |
| 91 else | |
| 92 { | |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
93 message ("Appending to kbd macro..."); |
| 11009 | 94 current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end; |
| 95 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
|
96 make_number (1)); |
| 246 | 97 } |
| 11009 | 98 current_kboard->defining_kbd_macro = Qt; |
| 246 | 99 |
| 100 return Qnil; | |
| 101 } | |
| 102 | |
| 103 DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 1, "p", | |
| 104 "Finish defining a keyboard macro.\n\ | |
| 105 The definition was started by \\[start-kbd-macro].\n\ | |
| 106 The macro is now available for use via \\[call-last-kbd-macro],\n\ | |
| 107 or it can be given a name with \\[name-last-kbd-macro] and then invoked\n\ | |
| 108 under that name.\n\ | |
| 109 \n\ | |
| 110 With numeric arg, repeat macro now that many times,\n\ | |
| 111 counting the definition just completed as the first repetition.\n\ | |
| 112 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
|
113 (repeat) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
114 Lisp_Object repeat; |
| 246 | 115 { |
| 11009 | 116 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
|
117 error ("Not defining kbd macro"); |
| 246 | 118 |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
119 if (NILP (repeat)) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
120 XSETFASTINT (repeat, 1); |
| 246 | 121 else |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
122 CHECK_NUMBER (repeat, 0); |
| 246 | 123 |
| 11009 | 124 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 125 { |
| 11009 | 126 current_kboard->defining_kbd_macro = Qnil; |
| 246 | 127 update_mode_lines++; |
| 11009 | 128 current_kboard->Vlast_kbd_macro |
| 129 = make_event_array ((current_kboard->kbd_macro_end | |
| 130 - current_kboard->kbd_macro_buffer), | |
| 131 current_kboard->kbd_macro_buffer); | |
|
14301
621f53083d60
* macros.c (Fstart_kbd_macro): Use xmalloc.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
132 message ("Keyboard macro defined"); |
| 246 | 133 } |
| 134 | |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
135 if (XFASTINT (repeat) == 0) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
136 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat); |
| 246 | 137 else |
| 138 { | |
|
14081
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
139 XSETINT (repeat, XINT (repeat)-1); |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
140 if (XINT (repeat) > 0) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
141 Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat); |
| 246 | 142 } |
| 143 return Qnil; | |
| 144 } | |
| 145 | |
| 146 /* Store character c into kbd macro being defined */ | |
| 147 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
148 void |
| 246 | 149 store_kbd_macro_char (c) |
| 150 Lisp_Object c; | |
| 151 { | |
| 11009 | 152 if (!NILP (current_kboard->defining_kbd_macro)) |
| 246 | 153 { |
| 11009 | 154 if ((current_kboard->kbd_macro_ptr |
| 155 - current_kboard->kbd_macro_buffer) | |
| 156 == current_kboard->kbd_macro_bufsize) | |
| 246 | 157 { |
|
10910
b0edc245c9b7
(defining_kbd_macro): Delete; now part of perdisplay. All uses changed.
Karl Heuer <kwzh@gnu.org>
parents:
10856
diff
changeset
|
158 register Lisp_Object *new; |
| 11009 | 159 current_kboard->kbd_macro_bufsize *= 2; |
| 160 new = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer, | |
| 161 (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
|
162 * sizeof (Lisp_Object))); |
| 11009 | 163 current_kboard->kbd_macro_ptr |
| 164 += new - current_kboard->kbd_macro_buffer; | |
| 165 current_kboard->kbd_macro_end | |
| 166 += new - current_kboard->kbd_macro_buffer; | |
| 167 current_kboard->kbd_macro_buffer = new; | |
| 246 | 168 } |
| 11009 | 169 *current_kboard->kbd_macro_ptr++ = c; |
| 246 | 170 } |
| 171 } | |
| 172 | |
| 173 /* Declare that all chars stored so far in the kbd macro being defined | |
| 174 really belong to it. This is done in between editor commands. */ | |
| 175 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
176 void |
| 246 | 177 finalize_kbd_macro_chars () |
| 178 { | |
| 11009 | 179 current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr; |
| 246 | 180 } |
|
12845
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
181 |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
182 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
|
183 Scancel_kbd_macro_events, 0, 0, 0, |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
184 "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
|
185 () |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
186 { |
|
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
187 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
|
188 } |
|
13773
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
189 |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
190 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
|
191 Sstore_kbd_macro_event, 1, 1, 0, |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
192 "Store EVENT into the keyboard macro being defined.") |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
193 (event) |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
194 Lisp_Object event; |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
195 { |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
196 store_kbd_macro_char (event); |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
197 return Qnil; |
|
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
198 } |
| 246 | 199 |
| 200 DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro, | |
| 201 0, 1, "p", | |
| 202 "Call the last keyboard macro that you defined with \\[start-kbd-macro].\n\ | |
| 203 \n\ | |
| 204 A prefix argument serves as a repeat count. Zero means repeat until error.\n\ | |
| 205 \n\ | |
| 206 To make a macro permanent so you can call it even after\n\ | |
| 207 defining others, use \\[name-last-kbd-macro].") | |
| 208 (prefix) | |
| 209 Lisp_Object prefix; | |
| 210 { | |
|
16562
4999fc12564e
(Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents:
15976
diff
changeset
|
211 /* 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
|
212 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
|
213 Vthis_command = current_kboard->Vlast_command; |
|
24530
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
214 /* 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
|
215 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
|
216 |
| 11009 | 217 if (! NILP (current_kboard->defining_kbd_macro)) |
| 246 | 218 error ("Can't execute anonymous macro while defining one"); |
| 11009 | 219 else if (NILP (current_kboard->Vlast_kbd_macro)) |
| 246 | 220 error ("No kbd macro has been defined"); |
| 221 else | |
| 11009 | 222 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
|
223 |
|
4999fc12564e
(Fcall_last_kbd_macro): Set this_command from last_command
Richard M. Stallman <rms@gnu.org>
parents:
15976
diff
changeset
|
224 /* 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
|
225 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
|
226 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
|
227 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
|
228 |
| 246 | 229 return Qnil; |
| 230 } | |
| 231 | |
| 232 /* Restore Vexecuting_macro and executing_macro_index - called when | |
| 233 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
|
234 |
| 246 | 235 static Lisp_Object |
| 236 pop_kbd_macro (info) | |
| 237 Lisp_Object info; | |
| 238 { | |
| 239 Lisp_Object tem; | |
|
24530
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
240 Vexecuting_macro = XCAR (info); |
|
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
241 tem = XCDR (info); |
|
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
242 executing_macro_index = XINT (XCAR (tem)); |
|
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
243 real_this_command = XCDR (tem); |
| 246 | 244 return Qnil; |
| 245 } | |
| 246 | |
| 247 DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 2, 0, | |
| 248 "Execute MACRO as string of editor command characters.\n\ | |
| 249 If MACRO is a symbol, its function definition is used.\n\ | |
| 250 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
|
251 (macro, count) |
|
addc50fc3981
(Fend_kbd_macro, Fexecute_kbd_macro): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13773
diff
changeset
|
252 Lisp_Object macro, count; |
| 246 | 253 { |
| 254 Lisp_Object final; | |
| 255 Lisp_Object tem; | |
|
14094
e5e4fe8e968f
(Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents:
14081
diff
changeset
|
256 int pdlcount = specpdl_ptr - specpdl; |
| 246 | 257 int repeat = 1; |
| 258 struct gcpro gcpro1; | |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
259 int success_count = 0; |
| 246 | 260 |
|
24482
9b722e922325
(Fexecute_kbd_macro): Initialize executing_macro_iterations at beginning.
Karl Heuer <kwzh@gnu.org>
parents:
23434
diff
changeset
|
261 executing_macro_iterations = 0; |
|
9b722e922325
(Fexecute_kbd_macro): Initialize executing_macro_iterations at beginning.
Karl Heuer <kwzh@gnu.org>
parents:
23434
diff
changeset
|
262 |
|
14100
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
263 if (!NILP (count)) |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
264 { |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
265 count = Fprefix_numeric_value (count); |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
266 repeat = XINT (count); |
|
0950fefc4bd1
(Fexecute_kbd_macro): Reindent properly.
Erik Naggum <erik@naggum.no>
parents:
14094
diff
changeset
|
267 } |
| 246 | 268 |
| 647 | 269 final = indirect_function (macro); |
|
9122
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
270 if (!STRINGP (final) && !VECTORP (final)) |
|
22915
ef9dd93e3077
(Fexecute_kbd_macro): Fix error message.
Richard M. Stallman <rms@gnu.org>
parents:
20299
diff
changeset
|
271 error ("Keyboard macros must be strings or vectors"); |
| 246 | 272 |
|
24530
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
273 tem = Fcons (Vexecuting_macro, |
|
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
274 Fcons (make_number (executing_macro_index), |
|
14cc75ebfd7b
(Fexecute_kbd_macro): Save real_this_command.
Karl Heuer <kwzh@gnu.org>
parents:
24482
diff
changeset
|
275 real_this_command)); |
| 246 | 276 record_unwind_protect (pop_kbd_macro, tem); |
| 277 | |
| 278 GCPRO1 (final); | |
| 279 do | |
| 280 { | |
| 281 Vexecuting_macro = final; | |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
282 executing_macro = final; |
| 246 | 283 executing_macro_index = 0; |
| 284 | |
|
12119
d7b51659a56d
(Fexecute_kbd_macro): Vprefix_arg is now part of kboard.
Karl Heuer <kwzh@gnu.org>
parents:
11341
diff
changeset
|
285 current_kboard->Vprefix_arg = Qnil; |
| 246 | 286 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
|
287 |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
288 executing_macro_iterations = ++success_count; |
|
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
289 |
|
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
|
290 QUIT; |
| 246 | 291 } |
|
9122
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
292 while (--repeat |
|
9ba3f17d6631
(Fexecute_kbd_macro): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
4696
diff
changeset
|
293 && (STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro))); |
| 246 | 294 |
|
15968
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
295 executing_macro = Qnil; |
|
231e14e38946
(executing_macro_iterations, executing_macro): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
15223
diff
changeset
|
296 |
|
23434
1dd05eb0443d
(Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents:
22968
diff
changeset
|
297 real_this_command = Vexecuting_macro; |
|
1dd05eb0443d
(Fexecute_kbd_macro): Set real_this_command.
Richard M. Stallman <rms@gnu.org>
parents:
22968
diff
changeset
|
298 |
| 246 | 299 UNGCPRO; |
|
14094
e5e4fe8e968f
(Fexecute_kbd_macro): Local var `pdlcount' renamed from
Karl Heuer <kwzh@gnu.org>
parents:
14081
diff
changeset
|
300 return unbind_to (pdlcount, Qnil); |
| 246 | 301 } |
| 302 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
303 void |
| 246 | 304 init_macros () |
| 305 { | |
| 306 Vexecuting_macro = Qnil; | |
|
15976
e6d654e1fa2a
(init_macros): Initialize executing_macro, too.
Erik Naggum <erik@naggum.no>
parents:
15968
diff
changeset
|
307 executing_macro = Qnil; |
| 246 | 308 } |
| 309 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
310 void |
| 246 | 311 syms_of_macros () |
| 312 { | |
| 313 Qexecute_kbd_macro = intern ("execute-kbd-macro"); | |
| 314 staticpro (&Qexecute_kbd_macro); | |
| 315 | |
| 316 defsubr (&Sstart_kbd_macro); | |
| 317 defsubr (&Send_kbd_macro); | |
| 318 defsubr (&Scall_last_kbd_macro); | |
| 319 defsubr (&Sexecute_kbd_macro); | |
|
12845
9ee2045cda62
(Fcancel_kbd_macro_events): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12119
diff
changeset
|
320 defsubr (&Scancel_kbd_macro_events); |
|
13773
7d50ac085b12
(Fstore_kbd_macro_event): New function.
Karl Heuer <kwzh@gnu.org>
parents:
12845
diff
changeset
|
321 defsubr (&Sstore_kbd_macro_event); |
| 246 | 322 |
| 11009 | 323 DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro, |
| 246 | 324 "Non-nil while a keyboard macro is being defined. Don't set this!"); |
| 325 | |
| 326 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
|
327 "Currently executing keyboard macro (string or vector); nil if none executing."); |
| 246 | 328 |
| 329 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
|
330 "Currently executing keyboard macro (string or vector); nil if none executing."); |
| 246 | 331 |
| 11009 | 332 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
|
333 "Last kbd macro defined, as a string or vector; nil if none defined."); |
| 246 | 334 } |
| 335 | |
|
20299
608c1a9aefc8
(store_kbd_macro_char): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16562
diff
changeset
|
336 void |
| 246 | 337 keys_of_macros () |
| 338 { | |
| 339 initial_define_key (control_x_map, ('e'), "call-last-kbd-macro"); | |
| 340 initial_define_key (control_x_map, ('('), "start-kbd-macro"); | |
| 341 initial_define_key (control_x_map, (')'), "end-kbd-macro"); | |
| 342 } |
