(preserved_fns): New var.
[bpt/emacs.git] / src / callint.c
CommitLineData
ec28a64d 1/* Call a Lisp function interactively.
46947372 2 Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
ec28a64d
MB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "lisp.h"
23#include "buffer.h"
24#include "commands.h"
760cbdd3 25#include "keyboard.h"
ec28a64d
MB
26#include "window.h"
27#include "mocklisp.h"
28
29extern char *index ();
30
31Lisp_Object Vprefix_arg, Vcurrent_prefix_arg, Qminus;
32Lisp_Object Qcall_interactively;
33Lisp_Object Vcommand_history;
34
35Lisp_Object Vcommand_debug_status, Qcommand_debug_status;
52614803 36Lisp_Object Qenable_recursive_minibuffers;
ec28a64d 37
03e130d5
RS
38Lisp_Object Qlist;
39Lisp_Object preserved_fns;
40
ec28a64d
MB
41/* This comment supplies the doc string for interactive,
42 for make-docfile to see. We cannot put this in the real DEFUN
43 due to limits in the Unix cpp.
44
45DEFUN ("interactive", Ffoo, Sfoo, 0, 0, 0,
46 "Specify a way of parsing arguments for interactive use of a function.\n\
47For example, write\n\
48 (defun foo (arg) \"Doc string\" (interactive \"p\") ...use arg...)\n\
49to make ARG be the prefix argument when `foo' is called as a command.\n\
50The \"call\" to `interactive' is actually a declaration rather than a function;\n\
51 it tells `call-interactively' how to read arguments\n\
52 to pass to the function.\n\
53When actually called, `interactive' just returns nil.\n\
54\n\
55The argument of `interactive' is usually a string containing a code letter\n\
56 followed by a prompt. (Some code letters do not use I/O to get\n\
57 the argument and do not need prompts.) To prompt for multiple arguments,\n\
58 give a code letter, its prompt, a newline, and another code letter, etc.\n\
59 Prompts are passed to format, and may use % escapes to print the\n\
60 arguments that have already been read.\n\
61If the argument is not a string, it is evaluated to get a list of\n\
62 arguments to pass to the function.\n\
63Just `(interactive)' means pass no args when calling interactively.\n\
64\nCode letters available are:\n\
65a -- Function name: symbol with a function definition.\n\
66b -- Name of existing buffer.\n\
67B -- Name of buffer, possibly nonexistent.\n\
68c -- Character.\n\
69C -- Command name: symbol with interactive function definition.\n\
70d -- Value of point as number. Does not do I/O.\n\
71D -- Directory name.\n\
bc78232c
JB
72e -- Event that invoked this command (value of `last-nonmenu-event').\n\
73 This skips events without parameters.\n\
74 If used more than once, the Nth 'e' returns the Nth parameterized event.\n\
ec28a64d
MB
75f -- Existing file name.\n\
76F -- Possibly nonexistent file name.\n\
77k -- Key sequence (string).\n\
78m -- Value of mark as number. Does not do I/O.\n\
79n -- Number read using minibuffer.\n\
80N -- Prefix arg converted to number, or if none, do like code `n'.\n\
81p -- Prefix arg converted to number. Does not do I/O.\n\
82P -- Prefix arg in raw form. Does not do I/O.\n\
83r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.\n\
84s -- Any string.\n\
85S -- Any symbol.\n\
86v -- Variable name: symbol that is user-variable-p.\n\
87x -- Lisp expression read but not evaluated.\n\
88X -- Lisp expression read and evaluated.\n\
89In addition, if the string begins with `*'\n\
90 then an error is signaled if the buffer is read-only.\n\
91 This happens before reading any arguments.\n\
92If the string begins with `@', then the window the mouse is over is selected\n\
93 before anything else is done. You may use both `@' and `*';\n\
94they are processed in the order that they appear."
95*/
96
97/* ARGSUSED */
98DEFUN ("interactive", Finteractive, Sinteractive, 0, UNEVALLED, 0,
99 0 /* See immediately above */)
100 (args)
101 Lisp_Object args;
102{
103 return Qnil;
104}
105
106/* Quotify EXP: if EXP is constant, return it.
107 If EXP is not constant, return (quote EXP). */
108Lisp_Object
109quotify_arg (exp)
110 register Lisp_Object exp;
111{
112 if (XTYPE (exp) != Lisp_Int && XTYPE (exp) != Lisp_String
265a9e55 113 && !NILP (exp) && !EQ (exp, Qt))
ec28a64d
MB
114 return Fcons (Qquote, Fcons (exp, Qnil));
115
116 return exp;
117}
118
119/* Modify EXP by quotifying each element (except the first). */
120Lisp_Object
121quotify_args (exp)
122 Lisp_Object exp;
123{
124 register Lisp_Object tail;
125 register struct Lisp_Cons *ptr;
126 for (tail = exp; CONSP (tail); tail = ptr->cdr)
127 {
128 ptr = XCONS (tail);
129 ptr->car = quotify_arg (ptr->car);
130 }
131 return exp;
132}
133
134char *callint_argfuns[]
135 = {"", "point", "mark", "region-beginning", "region-end"};
136
137static void
138check_mark ()
139{
140 Lisp_Object tem = Fmarker_buffer (current_buffer->mark);
265a9e55 141 if (NILP (tem) || (XBUFFER (tem) != current_buffer))
ec28a64d
MB
142 error ("The mark is not set now");
143}
144
145
146DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 2, 0,
147 "Call FUNCTION, reading args according to its interactive calling specs.\n\
148The function contains a specification of how to do the argument reading.\n\
149In the case of user-defined functions, this is specified by placing a call\n\
150to the function `interactive' at the top level of the function body.\n\
151See `interactive'.\n\
152\n\
153Optional second arg RECORD-FLAG non-nil\n\
154means unconditionally put this command in the command-history.\n\
155Otherwise, this is done only if an arg is read using the minibuffer.")
156 (function, record)
157 Lisp_Object function, record;
158{
159 Lisp_Object *args, *visargs;
160 unsigned char **argstrings;
161 Lisp_Object fun;
162 Lisp_Object funcar;
163 Lisp_Object specs;
164 Lisp_Object teml;
52614803
RS
165 Lisp_Object enable;
166 int speccount = specpdl_ptr - specpdl;
ec28a64d 167
bc78232c
JB
168 /* The index of the next element of this_command_keys to examine for
169 the 'e' interactive code. */
170 int next_event = 0;
171
ec28a64d
MB
172 Lisp_Object prefix_arg;
173 unsigned char *string;
174 unsigned char *tem;
63007de2
JB
175
176 /* If varies[i] > 0, the i'th argument shouldn't just have its value
177 in this call quoted in the command history. It should be
178 recorded as a call to the function named callint_argfuns[varies[i]]. */
ec28a64d 179 int *varies;
63007de2 180
ec28a64d
MB
181 register int i, j;
182 int count, foo;
183 char prompt[100];
184 char prompt1[100];
185 char *tem1;
186 int arg_from_tty = 0;
187 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
188
e5d77022 189 /* Save this now, since use of minibuffer will clobber it. */
ec28a64d
MB
190 prefix_arg = Vcurrent_prefix_arg;
191
46947372 192 retry:
ec28a64d 193
afa4c0f3
JB
194 if (XTYPE (function) == Lisp_Symbol)
195 enable = Fget (function, Qenable_recursive_minibuffers);
52614803 196
ffd56f97 197 fun = indirect_function (function);
ec28a64d
MB
198
199 specs = Qnil;
200 string = 0;
201
202 /* Decode the kind of function. Either handle it and return,
203 or go to `lose' if not interactive, or go to `retry'
204 to specify a different function, or set either STRING or SPECS. */
205
206 if (XTYPE (fun) == Lisp_Subr)
207 {
208 string = (unsigned char *) XSUBR (fun)->prompt;
209 if (!string)
210 {
211 lose:
212 function = wrong_type_argument (Qcommandp, function, 0);
213 goto retry;
214 }
215 if ((int) string == 1)
216 /* Let SPECS (which is nil) be used as the args. */
217 string = 0;
218 }
219 else if (XTYPE (fun) == Lisp_Compiled)
220 {
221 if (XVECTOR (fun)->size <= COMPILED_INTERACTIVE)
222 goto lose;
223 specs = XVECTOR (fun)->contents[COMPILED_INTERACTIVE];
224 }
225 else if (!CONSP (fun))
226 goto lose;
227 else if (funcar = Fcar (fun), EQ (funcar, Qautoload))
228 {
229 GCPRO2 (function, prefix_arg);
230 do_autoload (fun, function);
231 UNGCPRO;
232 goto retry;
233 }
234 else if (EQ (funcar, Qlambda))
235 {
236 specs = Fassq (Qinteractive, Fcdr (Fcdr (fun)));
265a9e55 237 if (NILP (specs))
ec28a64d
MB
238 goto lose;
239 specs = Fcar (Fcdr (specs));
240 }
241 else if (EQ (funcar, Qmocklisp))
242 return ml_apply (fun, Qinteractive);
243 else
244 goto lose;
245
46947372 246 /* If either specs or string is set to a string, use it. */
ec28a64d 247 if (XTYPE (specs) == Lisp_String)
46947372
JB
248 {
249 /* Make a copy of string so that if a GC relocates specs,
250 `string' will still be valid. */
e5d77022 251 string = (unsigned char *) alloca (XSTRING (specs)->size + 1);
46947372
JB
252 bcopy (XSTRING (specs)->data, string, XSTRING (specs)->size + 1);
253 }
ec28a64d
MB
254 else if (string == 0)
255 {
03e130d5 256 Lisp_Object input;
ec28a64d 257 i = num_input_chars;
03e130d5
RS
258 input = specs;
259 /* Compute the arg values using the user's expression. */
ec28a64d 260 specs = Feval (specs);
265a9e55 261 if (i != num_input_chars || !NILP (record))
03e130d5
RS
262 {
263 /* We should record this command on the command history. */
264 Lisp_Object values, car;
265 /* Make a copy of the list of values, for the command history,
266 and turn them into things we can eval. */
267 values = quotify_args (Fcopy_sequence (specs));
268 /* If the list of args was produced with an explicit call to `list',
269 look for elements that were computed with (region-beginning)
270 or (region-end), and put those expressions into VALUES
271 instead of the present values. */
272 car = Fcar (input);
273 if (EQ (car, Qlist))
274 {
275 Lisp_Object intail, valtail;
276 for (intail = Fcdr (input), valtail = values;
277 CONSP (valtail);
278 intail = Fcdr (intail), valtail = Fcdr (valtail))
279 {
280 Lisp_Object elt;
281 elt = Fcar (intail);
282 if (CONSP (elt))
283 {
284 Lisp_Object presflag;
285 presflag = Fmemq (Fcar (elt), preserved_fns);
286 if (!NILP (presflag))
287 Fsetcar (valtail, Fcar (intail));
288 }
289 }
290 }
291 Vcommand_history
292 = Fcons (Fcons (function, values), Vcommand_history);
293 }
ec28a64d
MB
294 return apply1 (function, specs);
295 }
296
297 /* Here if function specifies a string to control parsing the defaults */
298
299 /* Handle special starting chars `*' and `@'. */
300 while (1)
301 {
302 if (*string == '*')
303 {
304 string++;
265a9e55 305 if (!NILP (current_buffer->read_only))
ec28a64d
MB
306 Fbarf_if_buffer_read_only ();
307 }
308 else if (*string == '@')
309 {
310 string++;
265a9e55 311 if (!NILP (Vmouse_window))
ec28a64d
MB
312 Fselect_window (Vmouse_window);
313 }
314 else break;
315 }
316
317 /* Count the number of arguments the interactive spec would have
318 us give to the function. */
319 tem = string;
320 for (j = 0; *tem; j++)
321 {
322 /* 'r' specifications ("point and mark as 2 numeric args")
323 produce *two* arguments. */
324 if (*tem == 'r') j++;
325 tem = (unsigned char *) index (tem, '\n');
326 if (tem)
327 tem++;
328 else
329 tem = (unsigned char *) "";
330 }
331 count = j;
332
333 args = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
334 visargs = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
335 argstrings = (unsigned char **) alloca ((count + 1) * sizeof (char *));
336 varies = (int *) alloca ((count + 1) * sizeof (int));
337
338 for (i = 0; i < (count + 1); i++)
339 {
340 args[i] = Qnil;
341 visargs[i] = Qnil;
342 varies[i] = 0;
343 }
344
345 GCPRO4 (prefix_arg, function, *args, *visargs);
346 gcpro3.nvars = (count + 1);
347 gcpro4.nvars = (count + 1);
348
52614803
RS
349 if (!NILP (enable))
350 specbind (Qenable_recursive_minibuffers, Qt);
351
ec28a64d 352 tem = string;
46947372 353 for (i = 1; *tem; i++)
ec28a64d
MB
354 {
355 strncpy (prompt1, tem + 1, sizeof prompt1 - 1);
356 prompt1[sizeof prompt1 - 1] = 0;
357 tem1 = index (prompt1, '\n');
358 if (tem1) *tem1 = 0;
359 /* Fill argstrings with a vector of C strings
360 corresponding to the Lisp strings in visargs. */
361 for (j = 1; j < i; j++)
362 argstrings[j]
363 = EQ (visargs[j], Qnil)
364 ? (unsigned char *) ""
46947372 365 : XSTRING (visargs[j])->data;
ec28a64d
MB
366
367 doprnt (prompt, sizeof prompt, prompt1, 0, j - 1, argstrings + 1);
368
369 switch (*tem)
370 {
371 case 'a': /* Symbol defined as a function */
372 visargs[i] = Fcompleting_read (build_string (prompt),
373 Vobarray, Qfboundp, Qt, Qnil, Qnil);
374 /* Passing args[i] directly stimulates compiler bug */
375 teml = visargs[i];
376 args[i] = Fintern (teml, Qnil);
377 break;
378
379 case 'b': /* Name of existing buffer */
380 args[i] = Fcurrent_buffer ();
381 if (EQ (selected_window, minibuf_window))
9262fcb6 382 args[i] = Fother_buffer (args[i], Qnil);
ec28a64d
MB
383 args[i] = Fread_buffer (build_string (prompt), args[i], Qt);
384 break;
385
386 case 'B': /* Name of buffer, possibly nonexistent */
387 args[i] = Fread_buffer (build_string (prompt),
9262fcb6
RS
388 Fother_buffer (Fcurrent_buffer (), Qnil),
389 Qnil);
ec28a64d
MB
390 break;
391
392 case 'c': /* Character */
393 message1 (prompt);
394 args[i] = Fread_char ();
395 /* Passing args[i] directly stimulates compiler bug */
396 teml = args[i];
397 visargs[i] = Fchar_to_string (teml);
398 break;
399
400 case 'C': /* Command: symbol with interactive function */
401 visargs[i] = Fcompleting_read (build_string (prompt),
402 Vobarray, Qcommandp, Qt, Qnil, Qnil);
403 /* Passing args[i] directly stimulates compiler bug */
404 teml = visargs[i];
405 args[i] = Fintern (teml, Qnil);
406 break;
407
408 case 'd': /* Value of point. Does not do I/O. */
409 XFASTINT (args[i]) = point;
410 /* visargs[i] = Qnil; */
411 varies[i] = 1;
412 break;
413
ec28a64d
MB
414 case 'D': /* Directory name. */
415 args[i] = Fread_file_name (build_string (prompt), Qnil,
416 current_buffer->directory, Qlambda, Qnil);
417 break;
418
419 case 'f': /* Existing file name. */
420 args[i] = Fread_file_name (build_string (prompt),
421 Qnil, Qnil, Qlambda, Qnil);
422 break;
423
424 case 'F': /* Possibly nonexistent file name. */
425 args[i] = Fread_file_name (build_string (prompt),
426 Qnil, Qnil, Qnil, Qnil);
427 break;
428
429 case 'k': /* Key sequence (string) */
63007de2 430 args[i] = Fread_key_sequence (build_string (prompt), Qnil);
ec28a64d
MB
431 teml = args[i];
432 visargs[i] = Fkey_description (teml);
433 break;
434
bc78232c
JB
435 case 'e': /* The invoking event. */
436 /* Find the next parameterized event. */
437 while (next_event < this_command_key_count
7e6491d3
JB
438 && ! (EVENT_HAS_PARAMETERS
439 (XVECTOR (this_command_keys)->contents[next_event])))
bc78232c
JB
440 next_event++;
441 if (next_event >= this_command_key_count)
442 error ("%s must be bound to an event with parameters",
63007de2
JB
443 (XTYPE (function) == Lisp_Symbol
444 ? (char *) XSYMBOL (function)->name->data
bc78232c 445 : "command"));
7e6491d3 446 args[i] = XVECTOR (this_command_keys)->contents[next_event++];
e5d77022 447 varies[i] = -1;
63007de2
JB
448 break;
449
ec28a64d
MB
450 case 'm': /* Value of mark. Does not do I/O. */
451 check_mark ();
452 /* visargs[i] = Qnil; */
453 XFASTINT (args[i]) = marker_position (current_buffer->mark);
454 varies[i] = 2;
455 break;
456
457 case 'N': /* Prefix arg, else number from minibuffer */
265a9e55 458 if (!NILP (prefix_arg))
ec28a64d
MB
459 goto have_prefix_arg;
460 case 'n': /* Read number from minibuffer. */
461 do
462 args[i] = Fread_minibuffer (build_string (prompt), Qnil);
4746118a 463 while (! NUMBERP (args[i]));
ec28a64d
MB
464 visargs[i] = last_minibuf_string;
465 break;
466
467 case 'P': /* Prefix arg in raw form. Does no I/O. */
468 have_prefix_arg:
469 args[i] = prefix_arg;
470 /* visargs[i] = Qnil; */
471 varies[i] = -1;
472 break;
473
474 case 'p': /* Prefix arg converted to number. No I/O. */
475 args[i] = Fprefix_numeric_value (prefix_arg);
476 /* visargs[i] = Qnil; */
477 varies[i] = -1;
478 break;
479
480 case 'r': /* Region, point and mark as 2 args. */
481 check_mark ();
482 /* visargs[i+1] = Qnil; */
483 foo = marker_position (current_buffer->mark);
484 /* visargs[i] = Qnil; */
485 XFASTINT (args[i]) = point < foo ? point : foo;
486 varies[i] = 3;
487 XFASTINT (args[++i]) = point > foo ? point : foo;
488 varies[i] = 4;
489 break;
490
491 case 's': /* String read via minibuffer. */
492 args[i] = Fread_string (build_string (prompt), Qnil);
493 break;
494
495 case 'S': /* Any symbol. */
15c65264 496 visargs[i] = Fread_no_blanks_input (build_string (prompt), Qnil);
ec28a64d
MB
497 /* Passing args[i] directly stimulates compiler bug */
498 teml = visargs[i];
499 args[i] = Fintern (teml, Qnil);
500 break;
501
502 case 'v': /* Variable name: symbol that is
503 user-variable-p. */
504 args[i] = Fread_variable (build_string (prompt));
505 visargs[i] = last_minibuf_string;
506 break;
507
508 case 'x': /* Lisp expression read but not evaluated */
509 args[i] = Fread_minibuffer (build_string (prompt), Qnil);
510 visargs[i] = last_minibuf_string;
511 break;
512
513 case 'X': /* Lisp expression read and evaluated */
514 args[i] = Feval_minibuffer (build_string (prompt), Qnil);
515 visargs[i] = last_minibuf_string;
516 break;
517
518 default:
519 error ("Invalid control letter \"%c\" (%03o) in interactive calling string",
520 *tem, *tem);
521 }
522
523 if (varies[i] == 0)
524 arg_from_tty = 1;
525
265a9e55 526 if (NILP (visargs[i]) && XTYPE (args[i]) == Lisp_String)
ec28a64d
MB
527 visargs[i] = args[i];
528
529 tem = (unsigned char *) index (tem, '\n');
530 if (tem) tem++;
531 else tem = (unsigned char *) "";
532 }
52614803 533 unbind_to (speccount, Qnil);
ec28a64d
MB
534
535 QUIT;
536
537 args[0] = function;
538
265a9e55 539 if (arg_from_tty || !NILP (record))
ec28a64d
MB
540 {
541 visargs[0] = function;
63007de2
JB
542 for (i = 1; i < count + 1; i++)
543 if (varies[i] > 0)
ec28a64d
MB
544 visargs[i] = Fcons (intern (callint_argfuns[varies[i]]), Qnil);
545 else
546 visargs[i] = quotify_arg (args[i]);
547 Vcommand_history = Fcons (Flist (count + 1, visargs),
548 Vcommand_history);
549 }
550
551 {
552 Lisp_Object val;
ec28a64d
MB
553 specbind (Qcommand_debug_status, Qnil);
554
555 val = Ffuncall (count + 1, args);
556 UNGCPRO;
557 return unbind_to (speccount, val);
558 }
559}
560
561DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
562 1, 1, 0,
563 "Return numeric meaning of raw prefix argument ARG.\n\
564A raw prefix argument is what you get from `(interactive \"P\")'.\n\
565Its numeric meaning is what you would get from `(interactive \"p\")'.")
566 (raw)
567 Lisp_Object raw;
568{
569 Lisp_Object val;
570
571 /* Tag val as an integer, so the rest of the assignments
572 may use XSETINT. */
573 XFASTINT (val) = 0;
574
265a9e55 575 if (NILP (raw))
ec28a64d 576 XFASTINT (val) = 1;
fd5285f3 577 else if (EQ (raw, Qminus))
ec28a64d
MB
578 XSETINT (val, -1);
579 else if (CONSP (raw))
580 XSETINT (val, XINT (XCONS (raw)->car));
581 else if (XTYPE (raw) == Lisp_Int)
582 val = raw;
583 else
584 XFASTINT (val) = 1;
585
586 return val;
587}
588
589syms_of_callint ()
590{
03e130d5
RS
591 preserved_fns = Fcons (intern ("region-beginning"),
592 Fcons (intern ("region-end"),
593 Fcons (intern ("point"),
594 Fcons (intern ("mark"), Qnil))));
595 staticpro (&preserved_fns);
596
597 Qlist = intern ("list");
598 staticpro (&Qlist);
599
ec28a64d
MB
600 Qminus = intern ("-");
601 staticpro (&Qminus);
602
603 Qcall_interactively = intern ("call-interactively");
604 staticpro (&Qcall_interactively);
605
606 Qcommand_debug_status = intern ("command-debug-status");
607 staticpro (&Qcommand_debug_status);
608
52614803
RS
609 Qenable_recursive_minibuffers = intern ("enable-recursive-minibuffers");
610 staticpro (&Qenable_recursive_minibuffers);
611
ec28a64d
MB
612 DEFVAR_LISP ("prefix-arg", &Vprefix_arg,
613 "The value of the prefix argument for the next editing command.\n\
614It may be a number, or the symbol `-' for just a minus sign as arg,\n\
615or a list whose car is a number for just one or more C-U's\n\
616or nil if no argument has been specified.\n\
617\n\
618You cannot examine this variable to find the argument for this command\n\
619since it has been set to nil by the time you can look.\n\
620Instead, you should use the variable `current-prefix-arg', although\n\
621normally commands can get this prefix argument with (interactive \"P\").");
622 Vprefix_arg = Qnil;
623
624 DEFVAR_LISP ("current-prefix-arg", &Vcurrent_prefix_arg,
625 "The value of the prefix argument for this editing command.\n\
626It may be a number, or the symbol `-' for just a minus sign as arg,\n\
627or a list whose car is a number for just one or more C-U's\n\
628or nil if no argument has been specified.\n\
629This is what `(interactive \"P\")' returns.");
630 Vcurrent_prefix_arg = Qnil;
631
632 DEFVAR_LISP ("command-history", &Vcommand_history,
633 "List of recent commands that read arguments from terminal.\n\
634Each command is represented as a form to evaluate.");
635 Vcommand_history = Qnil;
636
637 DEFVAR_LISP ("command-debug-status", &Vcommand_debug_status,
638 "Debugging status of current interactive command.\n\
639Bound each time `call-interactively' is called;\n\
640may be set by the debugger as a reminder for itself.");
641 Vcommand_debug_status = Qnil;
642
643 defsubr (&Sinteractive);
644 defsubr (&Scall_interactively);
645 defsubr (&Sprefix_numeric_value);
646}