1 /* Call a Lisp function interactively.
2 Copyright (C) 1985, 1986, 1993, 1994, 1995, 1997, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
33 extern char *index (const char *, int);
36 extern Lisp_Object Qcursor_in_echo_area
;
37 extern Lisp_Object Qfile_directory_p
;
38 extern Lisp_Object Qonly
;
40 Lisp_Object Vcurrent_prefix_arg
, Qminus
, Qplus
;
41 Lisp_Object Qcall_interactively
;
42 Lisp_Object Vcommand_history
;
44 extern Lisp_Object Vhistory_length
;
45 extern Lisp_Object Vthis_original_command
, real_this_command
;
46 extern int history_delete_duplicates
;
48 Lisp_Object Vcommand_debug_status
, Qcommand_debug_status
;
49 Lisp_Object Qenable_recursive_minibuffers
;
50 extern Lisp_Object Qface
, Qminibuffer_prompt
;
52 /* Non-nil means treat the mark as active
53 even if mark_active is 0. */
54 Lisp_Object Vmark_even_if_inactive
;
56 Lisp_Object Qhandle_shift_selection
;
58 Lisp_Object Vmouse_leave_buffer_hook
, Qmouse_leave_buffer_hook
;
60 Lisp_Object Qlist
, Qlet
, Qletx
, Qsave_excursion
, Qprogn
, Qif
, Qwhen
;
61 static Lisp_Object preserved_fns
;
63 /* Marker used within call-interactively to refer to point. */
64 static Lisp_Object point_marker
;
66 /* String for the prompt text used in Fcall_interactively. */
67 static Lisp_Object callint_message
;
70 DEFUN ("interactive", Finteractive
, Sinteractive
, 0, UNEVALLED
, 0,
71 doc
: /* Specify a way of parsing arguments for interactive use of a function.
73 (defun foo (arg buf) "Doc string" (interactive "P\\nbbuffer: ") .... )
74 to make ARG be the raw prefix argument, and set BUF to an existing buffer,
75 when `foo' is called as a command.
76 The "call" to `interactive' is actually a declaration rather than a function;
77 it tells `call-interactively' how to read arguments
78 to pass to the function.
79 When actually called, `interactive' just returns nil.
81 Usually the argument of `interactive' is a string containing a code letter
82 followed optionally by a prompt. (Some code letters do not use I/O to get
83 the argument and do not use prompts.) To get several arguments, concatenate
84 the individual strings, separating them by newline characters.
85 Prompts are passed to format, and may use % escapes to print the
86 arguments that have already been read.
87 If the argument is not a string, it is evaluated to get a list of
88 arguments to pass to the function.
89 Just `(interactive)' means pass no args when calling interactively.
91 Code letters available are:
92 a -- Function name: symbol with a function definition.
93 b -- Name of existing buffer.
94 B -- Name of buffer, possibly nonexistent.
95 c -- Character (no input method is used).
96 C -- Command name: symbol with interactive function definition.
97 d -- Value of point as number. Does not do I/O.
99 e -- Parametrized event (i.e., one that's a list) that invoked this command.
100 If used more than once, the Nth `e' returns the Nth parameterized event.
101 This skips events that are integers or symbols.
102 f -- Existing file name.
103 F -- Possibly nonexistent file name.
104 G -- Possibly nonexistent file name, defaulting to just directory name.
105 i -- Ignored, i.e. always nil. Does not do I/O.
106 k -- Key sequence (downcase the last event if needed to get a definition).
107 K -- Key sequence to be redefined (do not downcase the last event).
108 m -- Value of mark as number. Does not do I/O.
109 M -- Any string. Inherits the current input method.
110 n -- Number read using minibuffer.
111 N -- Numeric prefix arg, or if none, do like code `n'.
112 p -- Prefix arg converted to number. Does not do I/O.
113 P -- Prefix arg in raw form. Does not do I/O.
114 r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.
115 s -- Any string. Does not inherit the current input method.
117 U -- Mouse up event discarded by a previous k or K argument.
118 v -- Variable name: symbol that is user-variable-p.
119 x -- Lisp expression read but not evaluated.
120 X -- Lisp expression read and evaluated.
122 Z -- Coding system, nil if no prefix arg.
124 In addition, if the string begins with `*', an error is signaled if
125 the buffer is read-only.
126 If the string begins with `@', Emacs searches the key sequence which
127 invoked the command for its first mouse click (or any other event
128 which specifies a window).
129 If the string begins with `^' and `shift-select-mode' is non-nil,
130 Emacs first calls the function `handle-shift-selection'.
131 You may use `@', `*', and `^' together. They are processed in the
132 order that they appear, before reading any arguments.
133 usage: (interactive &optional ARGS) */)
139 /* Quotify EXP: if EXP is constant, return it.
140 If EXP is not constant, return (quote EXP). */
142 quotify_arg (register Lisp_Object exp
)
144 if (!INTEGERP (exp
) && !STRINGP (exp
)
145 && !NILP (exp
) && !EQ (exp
, Qt
))
146 return Fcons (Qquote
, Fcons (exp
, Qnil
));
151 /* Modify EXP by quotifying each element (except the first). */
153 quotify_args (Lisp_Object exp
)
155 register Lisp_Object tail
;
157 for (tail
= exp
; CONSP (tail
); tail
= next
)
160 XSETCAR (tail
, quotify_arg (XCAR (tail
)));
165 char *callint_argfuns
[]
166 = {"", "point", "mark", "region-beginning", "region-end"};
169 check_mark (int for_region
)
172 tem
= Fmarker_buffer (current_buffer
->mark
);
173 if (NILP (tem
) || (XBUFFER (tem
) != current_buffer
))
174 error (for_region
? "The mark is not set now, so there is no region"
175 : "The mark is not set now");
176 if (!NILP (Vtransient_mark_mode
) && NILP (Vmark_even_if_inactive
)
177 && NILP (current_buffer
->mark_active
))
178 xsignal0 (Qmark_inactive
);
181 /* If the list of args INPUT was produced with an explicit call to
182 `list', look for elements that were computed with
183 (region-beginning) or (region-end), and put those expressions into
184 VALUES instead of the present values.
186 This function doesn't return a value because it modifies elements
187 of VALUES to do its job. */
190 fix_command (Lisp_Object input
, Lisp_Object values
)
197 /* Skip through certain special forms. */
198 while (EQ (car
, Qlet
) || EQ (car
, Qletx
)
199 || EQ (car
, Qsave_excursion
)
202 while (CONSP (XCDR (input
)))
203 input
= XCDR (input
);
204 input
= XCAR (input
);
211 Lisp_Object intail
, valtail
;
212 for (intail
= Fcdr (input
), valtail
= values
;
214 intail
= Fcdr (intail
), valtail
= XCDR (valtail
))
220 Lisp_Object presflag
, carelt
;
222 /* If it is (if X Y), look at Y. */
224 && EQ (Fnthcdr (make_number (3), elt
), Qnil
))
225 elt
= Fnth (make_number (2), elt
);
226 /* If it is (when ... Y), look at Y. */
227 else if (EQ (carelt
, Qwhen
))
229 while (CONSP (XCDR (elt
)))
234 /* If the function call we're looking at
235 is a special preserved one, copy the
236 whole expression for this argument. */
239 presflag
= Fmemq (Fcar (elt
), preserved_fns
);
240 if (!NILP (presflag
))
241 Fsetcar (valtail
, Fcar (intail
));
249 DEFUN ("call-interactively", Fcall_interactively
, Scall_interactively
, 1, 3, 0,
250 doc
: /* Call FUNCTION, reading args according to its interactive calling specs.
251 Return the value FUNCTION returns.
252 The function contains a specification of how to do the argument reading.
253 In the case of user-defined functions, this is specified by placing a call
254 to the function `interactive' at the top level of the function body.
257 Optional second arg RECORD-FLAG non-nil
258 means unconditionally put this command in the command-history.
259 Otherwise, this is done only if an arg is read using the minibuffer.
261 Optional third arg KEYS, if given, specifies the sequence of events to
262 supply, as a vector, if the command inquires which events were used to
263 invoke it. If KEYS is omitted or nil, the return value of
264 `this-command-keys-vector' is used. */)
265 (Lisp_Object function
, Lisp_Object record_flag
, Lisp_Object keys
)
267 Lisp_Object
*args
, *visargs
;
269 Lisp_Object filter_specs
;
271 Lisp_Object up_event
;
273 int speccount
= SPECPDL_INDEX ();
275 /* The index of the next element of this_command_keys to examine for
276 the 'e' interactive code. */
279 Lisp_Object prefix_arg
;
280 unsigned char *string
;
283 /* If varies[i] > 0, the i'th argument shouldn't just have its value
284 in this call quoted in the command history. It should be
285 recorded as a call to the function named callint_argfuns[varies[i]]. */
292 int arg_from_tty
= 0;
293 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
;
295 int record_then_fail
= 0;
297 Lisp_Object save_this_command
, save_last_command
;
298 Lisp_Object save_this_original_command
, save_real_this_command
;
300 save_this_command
= Vthis_command
;
301 save_this_original_command
= Vthis_original_command
;
302 save_real_this_command
= real_this_command
;
303 save_last_command
= current_kboard
->Vlast_command
;
306 keys
= this_command_keys
, key_count
= this_command_key_count
;
310 key_count
= XVECTOR (keys
)->size
;
313 /* Save this now, since use of minibuffer will clobber it. */
314 prefix_arg
= Vcurrent_prefix_arg
;
316 if (SYMBOLP (function
))
317 enable
= Fget (function
, Qenable_recursive_minibuffers
);
323 /* The idea of FILTER_SPECS is to provide away to
324 specify how to represent the arguments in command history.
325 The feature is not fully implemented. */
328 /* If k or K discard an up-event, save it here so it can be retrieved with U */
331 /* Set SPECS to the interactive form, or barf if not interactive. */
334 GCPRO2 (function
, prefix_arg
);
335 form
= Finteractive_form (function
);
338 specs
= filter_specs
= Fcar (XCDR (form
));
340 wrong_type_argument (Qcommandp
, function
);
343 /* If SPECS is set to a string, use it as an interactive prompt. */
346 /* Make a copy of string so that if a GC relocates specs,
347 `string' will still be valid. */
348 string
= (unsigned char *) alloca (SBYTES (specs
) + 1);
349 memcpy (string
, SDATA (specs
), SBYTES (specs
) + 1);
354 i
= num_input_events
;
356 /* Compute the arg values using the user's expression. */
357 GCPRO2 (input
, filter_specs
);
358 specs
= Feval (specs
);
360 if (i
!= num_input_events
|| !NILP (record_flag
))
362 /* We should record this command on the command history. */
364 Lisp_Object this_cmd
;
365 /* Make a copy of the list of values, for the command history,
366 and turn them into things we can eval. */
367 values
= quotify_args (Fcopy_sequence (specs
));
368 fix_command (input
, values
);
369 this_cmd
= Fcons (function
, values
);
370 if (history_delete_duplicates
)
371 Vcommand_history
= Fdelete (this_cmd
, Vcommand_history
);
372 Vcommand_history
= Fcons (this_cmd
, Vcommand_history
);
374 /* Don't keep command history around forever. */
375 if (INTEGERP (Vhistory_length
) && XINT (Vhistory_length
) > 0)
377 teml
= Fnthcdr (Vhistory_length
, Vcommand_history
);
379 XSETCDR (teml
, Qnil
);
383 Vthis_command
= save_this_command
;
384 Vthis_original_command
= save_this_original_command
;
385 real_this_command
= save_real_this_command
;
386 current_kboard
->Vlast_command
= save_last_command
;
388 temporarily_switch_to_single_kboard (NULL
);
389 return unbind_to (speccount
, apply1 (function
, specs
));
392 /* Here if function specifies a string to control parsing the defaults */
394 /* Set next_event to point to the first event with parameters. */
395 for (next_event
= 0; next_event
< key_count
; next_event
++)
396 if (EVENT_HAS_PARAMETERS (AREF (keys
, next_event
)))
399 /* Handle special starting chars `*' and `@'. Also `-'. */
400 /* Note that `+' is reserved for user extensions. */
404 error ("`+' is not used in `interactive' for ordinary commands");
405 else if (*string
== '*')
408 if (!NILP (current_buffer
->read_only
))
410 if (!NILP (record_flag
))
412 unsigned char *p
= string
;
415 if (! (*p
== 'r' || *p
== 'p' || *p
== 'P'
417 Fbarf_if_buffer_read_only ();
420 record_then_fail
= 1;
423 Fbarf_if_buffer_read_only ();
426 /* Ignore this for semi-compatibility with Lucid. */
427 else if (*string
== '-')
429 else if (*string
== '@')
431 Lisp_Object event
, tem
;
433 event
= (next_event
< key_count
434 ? AREF (keys
, next_event
)
436 if (EVENT_HAS_PARAMETERS (event
)
437 && (tem
= XCDR (event
), CONSP (tem
))
438 && (tem
= XCAR (tem
), CONSP (tem
))
439 && (tem
= XCAR (tem
), WINDOWP (tem
)))
441 if (MINI_WINDOW_P (XWINDOW (tem
))
442 && ! (minibuf_level
> 0 && EQ (tem
, minibuf_window
)))
443 error ("Attempt to select inactive minibuffer window");
445 /* If the current buffer wants to clean up, let it. */
446 if (!NILP (Vmouse_leave_buffer_hook
))
447 call1 (Vrun_hooks
, Qmouse_leave_buffer_hook
);
449 Fselect_window (tem
, Qnil
);
453 else if (*string
== '^')
455 call0 (Qhandle_shift_selection
);
461 /* Count the number of arguments the interactive spec would have
462 us give to the function. */
466 /* 'r' specifications ("point and mark as 2 numeric args")
467 produce *two* arguments. */
472 tem
= (unsigned char *) index (tem
, '\n');
480 args
= (Lisp_Object
*) alloca ((count
+ 1) * sizeof (Lisp_Object
));
481 visargs
= (Lisp_Object
*) alloca ((count
+ 1) * sizeof (Lisp_Object
));
482 varies
= (int *) alloca ((count
+ 1) * sizeof (int));
484 for (i
= 0; i
< (count
+ 1); i
++)
491 GCPRO5 (prefix_arg
, function
, *args
, *visargs
, up_event
);
492 gcpro3
.nvars
= (count
+ 1);
493 gcpro4
.nvars
= (count
+ 1);
496 specbind (Qenable_recursive_minibuffers
, Qt
);
499 for (i
= 1; *tem
; i
++)
501 strncpy (prompt1
, tem
+ 1, sizeof prompt1
- 1);
502 prompt1
[sizeof prompt1
- 1] = 0;
503 tem1
= (char *) index (prompt1
, '\n');
506 visargs
[0] = build_string (prompt1
);
507 if (index (prompt1
, '%'))
508 callint_message
= Fformat (i
, visargs
);
510 callint_message
= visargs
[0];
514 case 'a': /* Symbol defined as a function */
515 visargs
[i
] = Fcompleting_read (callint_message
,
516 Vobarray
, Qfboundp
, Qt
,
517 Qnil
, Qnil
, Qnil
, Qnil
);
518 /* Passing args[i] directly stimulates compiler bug */
520 args
[i
] = Fintern (teml
, Qnil
);
523 case 'b': /* Name of existing buffer */
524 args
[i
] = Fcurrent_buffer ();
525 if (EQ (selected_window
, minibuf_window
))
526 args
[i
] = Fother_buffer (args
[i
], Qnil
, Qnil
);
527 args
[i
] = Fread_buffer (callint_message
, args
[i
], Qt
);
530 case 'B': /* Name of buffer, possibly nonexistent */
531 args
[i
] = Fread_buffer (callint_message
,
532 Fother_buffer (Fcurrent_buffer (), Qnil
, Qnil
),
536 case 'c': /* Character */
537 /* Prompt in `minibuffer-prompt' face. */
538 Fput_text_property (make_number (0),
539 make_number (SCHARS (callint_message
)),
540 Qface
, Qminibuffer_prompt
, callint_message
);
541 args
[i
] = Fread_char (callint_message
, Qnil
, Qnil
);
542 message1_nolog ((char *) 0);
543 /* Passing args[i] directly stimulates compiler bug */
545 visargs
[i
] = Fchar_to_string (teml
);
548 case 'C': /* Command: symbol with interactive function */
549 visargs
[i
] = Fcompleting_read (callint_message
,
551 Qt
, Qnil
, Qnil
, Qnil
, Qnil
);
552 /* Passing args[i] directly stimulates compiler bug */
554 args
[i
] = Fintern (teml
, Qnil
);
557 case 'd': /* Value of point. Does not do I/O. */
558 set_marker_both (point_marker
, Qnil
, PT
, PT_BYTE
);
559 args
[i
] = point_marker
;
560 /* visargs[i] = Qnil; */
564 case 'D': /* Directory name. */
565 args
[i
] = Fread_file_name (callint_message
, Qnil
,
566 current_buffer
->directory
, Qlambda
, Qnil
,
570 case 'f': /* Existing file name. */
571 args
[i
] = Fread_file_name (callint_message
,
572 Qnil
, Qnil
, Qlambda
, Qnil
, Qnil
);
575 case 'F': /* Possibly nonexistent file name. */
576 args
[i
] = Fread_file_name (callint_message
,
577 Qnil
, Qnil
, Qnil
, Qnil
, Qnil
);
580 case 'G': /* Possibly nonexistent file name,
581 default to directory alone. */
582 args
[i
] = Fread_file_name (callint_message
,
583 Qnil
, Qnil
, Qnil
, empty_unibyte_string
, Qnil
);
586 case 'i': /* Ignore an argument -- Does not do I/O */
590 case 'k': /* Key sequence. */
592 int speccount1
= SPECPDL_INDEX ();
593 specbind (Qcursor_in_echo_area
, Qt
);
594 /* Prompt in `minibuffer-prompt' face. */
595 Fput_text_property (make_number (0),
596 make_number (SCHARS (callint_message
)),
597 Qface
, Qminibuffer_prompt
, callint_message
);
598 args
[i
] = Fread_key_sequence (callint_message
,
599 Qnil
, Qnil
, Qnil
, Qnil
);
600 unbind_to (speccount1
, Qnil
);
602 visargs
[i
] = Fkey_description (teml
, Qnil
);
604 /* If the key sequence ends with a down-event,
605 discard the following up-event. */
606 teml
= Faref (args
[i
], make_number (XINT (Flength (args
[i
])) - 1));
613 teml
= Fget (teml
, intern ("event-symbol-elements"));
614 /* Ignore first element, which is the base key. */
615 tem2
= Fmemq (intern ("down"), Fcdr (teml
));
617 up_event
= Fread_event (Qnil
, Qnil
, Qnil
);
622 case 'K': /* Key sequence to be defined. */
624 int speccount1
= SPECPDL_INDEX ();
625 specbind (Qcursor_in_echo_area
, Qt
);
626 /* Prompt in `minibuffer-prompt' face. */
627 Fput_text_property (make_number (0),
628 make_number (SCHARS (callint_message
)),
629 Qface
, Qminibuffer_prompt
, callint_message
);
630 args
[i
] = Fread_key_sequence (callint_message
,
631 Qnil
, Qt
, Qnil
, Qnil
);
633 visargs
[i
] = Fkey_description (teml
, Qnil
);
634 unbind_to (speccount1
, Qnil
);
636 /* If the key sequence ends with a down-event,
637 discard the following up-event. */
638 teml
= Faref (args
[i
], make_number (XINT (Flength (args
[i
])) - 1));
645 teml
= Fget (teml
, intern ("event-symbol-elements"));
646 /* Ignore first element, which is the base key. */
647 tem2
= Fmemq (intern ("down"), Fcdr (teml
));
649 up_event
= Fread_event (Qnil
, Qnil
, Qnil
);
654 case 'U': /* Up event from last k or K */
655 if (!NILP (up_event
))
657 args
[i
] = Fmake_vector (make_number (1), up_event
);
660 visargs
[i
] = Fkey_description (teml
, Qnil
);
664 case 'e': /* The invoking event. */
665 if (next_event
>= key_count
)
666 error ("%s must be bound to an event with parameters",
668 ? (char *) SDATA (SYMBOL_NAME (function
))
670 args
[i
] = AREF (keys
, next_event
);
674 /* Find the next parameterized event. */
675 while (next_event
< key_count
676 && !(EVENT_HAS_PARAMETERS (AREF (keys
, next_event
))))
681 case 'm': /* Value of mark. Does not do I/O. */
683 /* visargs[i] = Qnil; */
684 args
[i
] = current_buffer
->mark
;
688 case 'M': /* String read via minibuffer with
689 inheriting the current input method. */
690 args
[i
] = Fread_string (callint_message
,
691 Qnil
, Qnil
, Qnil
, Qt
);
694 case 'N': /* Prefix arg as number, else number from minibuffer */
695 if (!NILP (prefix_arg
))
696 goto have_prefix_arg
;
697 case 'n': /* Read number from minibuffer. */
705 message ("Please enter a number.");
706 sit_for (make_number (1), 0, 0);
710 tem
= Fread_from_minibuffer (callint_message
,
711 Qnil
, Qnil
, Qnil
, Qnil
, Qnil
,
713 if (! STRINGP (tem
) || SCHARS (tem
) == 0)
716 args
[i
] = Fread (tem
);
718 while (! NUMBERP (args
[i
]));
720 visargs
[i
] = args
[i
];
723 case 'P': /* Prefix arg in raw form. Does no I/O. */
724 args
[i
] = prefix_arg
;
725 /* visargs[i] = Qnil; */
729 case 'p': /* Prefix arg converted to number. No I/O. */
731 args
[i
] = Fprefix_numeric_value (prefix_arg
);
732 /* visargs[i] = Qnil; */
736 case 'r': /* Region, point and mark as 2 args. */
738 set_marker_both (point_marker
, Qnil
, PT
, PT_BYTE
);
739 /* visargs[i+1] = Qnil; */
740 foo
= marker_position (current_buffer
->mark
);
741 /* visargs[i] = Qnil; */
742 args
[i
] = PT
< foo
? point_marker
: current_buffer
->mark
;
744 args
[++i
] = PT
> foo
? point_marker
: current_buffer
->mark
;
748 case 's': /* String read via minibuffer without
749 inheriting the current input method. */
750 args
[i
] = Fread_string (callint_message
,
751 Qnil
, Qnil
, Qnil
, Qnil
);
754 case 'S': /* Any symbol. */
755 visargs
[i
] = Fread_string (callint_message
,
756 Qnil
, Qnil
, Qnil
, Qnil
);
757 /* Passing args[i] directly stimulates compiler bug */
759 args
[i
] = Fintern (teml
, Qnil
);
762 case 'v': /* Variable name: symbol that is
764 args
[i
] = Fread_variable (callint_message
, Qnil
);
765 visargs
[i
] = last_minibuf_string
;
768 case 'x': /* Lisp expression read but not evaluated */
769 args
[i
] = Fread_minibuffer (callint_message
, Qnil
);
770 visargs
[i
] = last_minibuf_string
;
773 case 'X': /* Lisp expression read and evaluated */
774 args
[i
] = Feval_minibuffer (callint_message
, Qnil
);
775 visargs
[i
] = last_minibuf_string
;
778 case 'Z': /* Coding-system symbol, or ignore the
779 argument if no prefix */
780 if (NILP (prefix_arg
))
788 = Fread_non_nil_coding_system (callint_message
);
789 visargs
[i
] = last_minibuf_string
;
793 case 'z': /* Coding-system symbol or nil */
794 args
[i
] = Fread_coding_system (callint_message
, Qnil
);
795 visargs
[i
] = last_minibuf_string
;
798 /* We have a case for `+' so we get an error
799 if anyone tries to define one here. */
802 error ("Invalid control letter `%c' (%03o) in interactive calling string",
809 if (NILP (visargs
[i
]) && STRINGP (args
[i
]))
810 visargs
[i
] = args
[i
];
812 tem
= (unsigned char *) index (tem
, '\n');
814 else tem
= (unsigned char *) "";
816 unbind_to (speccount
, Qnil
);
822 if (arg_from_tty
|| !NILP (record_flag
))
824 visargs
[0] = function
;
825 for (i
= 1; i
< count
+ 1; i
++)
828 visargs
[i
] = Fcons (intern (callint_argfuns
[varies
[i
]]), Qnil
);
830 visargs
[i
] = quotify_arg (args
[i
]);
832 Vcommand_history
= Fcons (Flist (count
+ 1, visargs
),
834 /* Don't keep command history around forever. */
835 if (INTEGERP (Vhistory_length
) && XINT (Vhistory_length
) > 0)
837 teml
= Fnthcdr (Vhistory_length
, Vcommand_history
);
839 XSETCDR (teml
, Qnil
);
843 /* If we used a marker to hold point, mark, or an end of the region,
844 temporarily, convert it to an integer now. */
845 for (i
= 1; i
<= count
; i
++)
846 if (varies
[i
] >= 1 && varies
[i
] <= 4)
847 XSETINT (args
[i
], marker_position (args
[i
]));
849 if (record_then_fail
)
850 Fbarf_if_buffer_read_only ();
852 Vthis_command
= save_this_command
;
853 Vthis_original_command
= save_this_original_command
;
854 real_this_command
= save_real_this_command
;
855 current_kboard
->Vlast_command
= save_last_command
;
859 specbind (Qcommand_debug_status
, Qnil
);
861 temporarily_switch_to_single_kboard (NULL
);
862 val
= Ffuncall (count
+ 1, args
);
864 return unbind_to (speccount
, val
);
868 DEFUN ("prefix-numeric-value", Fprefix_numeric_value
, Sprefix_numeric_value
,
870 doc
: /* Return numeric meaning of raw prefix argument RAW.
871 A raw prefix argument is what you get from `(interactive "P")'.
872 Its numeric meaning is what you would get from `(interactive "p")'. */)
878 XSETFASTINT (val
, 1);
879 else if (EQ (raw
, Qminus
))
881 else if (CONSP (raw
) && INTEGERP (XCAR (raw
)))
882 XSETINT (val
, XINT (XCAR (raw
)));
883 else if (INTEGERP (raw
))
886 XSETFASTINT (val
, 1);
892 syms_of_callint (void)
894 point_marker
= Fmake_marker ();
895 staticpro (&point_marker
);
897 callint_message
= Qnil
;
898 staticpro (&callint_message
);
900 preserved_fns
= pure_cons (intern_c_string ("region-beginning"),
901 pure_cons (intern_c_string ("region-end"),
902 pure_cons (intern_c_string ("point"),
903 pure_cons (intern_c_string ("mark"), Qnil
))));
905 Qlist
= intern_c_string ("list");
907 Qlet
= intern_c_string ("let");
909 Qif
= intern_c_string ("if");
911 Qwhen
= intern_c_string ("when");
913 Qletx
= intern_c_string ("let*");
915 Qsave_excursion
= intern_c_string ("save-excursion");
916 staticpro (&Qsave_excursion
);
917 Qprogn
= intern_c_string ("progn");
920 Qminus
= intern_c_string ("-");
923 Qplus
= intern_c_string ("+");
926 Qhandle_shift_selection
= intern_c_string ("handle-shift-selection");
927 staticpro (&Qhandle_shift_selection
);
929 Qcall_interactively
= intern_c_string ("call-interactively");
930 staticpro (&Qcall_interactively
);
932 Qcommand_debug_status
= intern_c_string ("command-debug-status");
933 staticpro (&Qcommand_debug_status
);
935 Qenable_recursive_minibuffers
= intern_c_string ("enable-recursive-minibuffers");
936 staticpro (&Qenable_recursive_minibuffers
);
938 Qmouse_leave_buffer_hook
= intern_c_string ("mouse-leave-buffer-hook");
939 staticpro (&Qmouse_leave_buffer_hook
);
941 DEFVAR_KBOARD ("prefix-arg", Vprefix_arg
,
942 doc
: /* The value of the prefix argument for the next editing command.
943 It may be a number, or the symbol `-' for just a minus sign as arg,
944 or a list whose car is a number for just one or more C-u's
945 or nil if no argument has been specified.
947 You cannot examine this variable to find the argument for this command
948 since it has been set to nil by the time you can look.
949 Instead, you should use the variable `current-prefix-arg', although
950 normally commands can get this prefix argument with (interactive "P"). */);
952 DEFVAR_KBOARD ("last-prefix-arg", Vlast_prefix_arg
,
953 doc
: /* The value of the prefix argument for the previous editing command.
954 See `prefix-arg' for the meaning of the value. */);
956 DEFVAR_LISP ("current-prefix-arg", &Vcurrent_prefix_arg
,
957 doc
: /* The value of the prefix argument for this editing command.
958 It may be a number, or the symbol `-' for just a minus sign as arg,
959 or a list whose car is a number for just one or more C-u's
960 or nil if no argument has been specified.
961 This is what `(interactive \"P\")' returns. */);
962 Vcurrent_prefix_arg
= Qnil
;
964 DEFVAR_LISP ("command-history", &Vcommand_history
,
965 doc
: /* List of recent commands that read arguments from terminal.
966 Each command is represented as a form to evaluate.
968 Maximum length of the history list is determined by the value
969 of `history-length', which see. */);
970 Vcommand_history
= Qnil
;
972 DEFVAR_LISP ("command-debug-status", &Vcommand_debug_status
,
973 doc
: /* Debugging status of current interactive command.
974 Bound each time `call-interactively' is called;
975 may be set by the debugger as a reminder for itself. */);
976 Vcommand_debug_status
= Qnil
;
978 DEFVAR_LISP ("mark-even-if-inactive", &Vmark_even_if_inactive
,
979 doc
: /* *Non-nil means you can use the mark even when inactive.
980 This option makes a difference in Transient Mark mode.
981 When the option is non-nil, deactivation of the mark
982 turns off region highlighting, but commands that use the mark
983 behave as if the mark were still active. */);
984 Vmark_even_if_inactive
= Qt
;
986 DEFVAR_LISP ("mouse-leave-buffer-hook", &Vmouse_leave_buffer_hook
,
987 doc
: /* Hook to run when about to switch windows with a mouse command.
988 Its purpose is to give temporary modes such as Isearch mode
989 a way to turn themselves off when a mouse command switches windows. */);
990 Vmouse_leave_buffer_hook
= Qnil
;
992 defsubr (&Sinteractive
);
993 defsubr (&Scall_interactively
);
994 defsubr (&Sprefix_numeric_value
);
997 /* arch-tag: a3a7cad7-bcac-42ce-916e-1bd2546ebf37
998 (do not change this comment) */