* autogen/update_autogen (msg): Remove function; use `exec' instead.
[bpt/emacs.git] / src / callint.c
CommitLineData
ec28a64d 1/* Call a Lisp function interactively.
73b0cd50 2 Copyright (C) 1985-1986, 1993-1995, 1997, 2000-2011
8cabe764 3 Free Software Foundation, Inc.
ec28a64d
MB
4
5This file is part of GNU Emacs.
6
9ec0b715 7GNU Emacs is free software: you can redistribute it and/or modify
ec28a64d 8it under the terms of the GNU General Public License as published by
9ec0b715
GM
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
ec28a64d
MB
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9ec0b715 18along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
ec28a64d
MB
19
20
18160b98 21#include <config.h>
d7306fe6 22#include <setjmp.h>
fdb82f93 23
ec28a64d
MB
24#include "lisp.h"
25#include "buffer.h"
26#include "commands.h"
760cbdd3 27#include "keyboard.h"
ec28a64d 28#include "window.h"
8feddab4 29#include "keymap.h"
ec28a64d 30
29208e82 31Lisp_Object Qminus, Qplus;
ec28a64d 32Lisp_Object Qcall_interactively;
29208e82 33Lisp_Object Qcommand_debug_status;
52614803 34Lisp_Object Qenable_recursive_minibuffers;
ec28a64d 35
84db11d6 36Lisp_Object Qhandle_shift_selection;
9bdb1538 37
29208e82 38Lisp_Object Qmouse_leave_buffer_hook;
ef2515c0 39
120d0a23 40Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn, Qif, Qwhen;
824977b6
RS
41static Lisp_Object preserved_fns;
42
43/* Marker used within call-interactively to refer to point. */
44static Lisp_Object point_marker;
03e130d5 45
55b41ef5
CY
46/* String for the prompt text used in Fcall_interactively. */
47static Lisp_Object callint_message;
425b457e 48\f
ec28a64d
MB
49/* ARGSUSED */
50DEFUN ("interactive", Finteractive, Sinteractive, 0, UNEVALLED, 0,
fdb82f93
PJ
51 doc: /* Specify a way of parsing arguments for interactive use of a function.
52For example, write
f9257eed
AM
53 (defun foo (arg buf) "Doc string" (interactive "P\\nbbuffer: ") .... )
54 to make ARG be the raw prefix argument, and set BUF to an existing buffer,
55 when `foo' is called as a command.
fdb82f93
PJ
56The "call" to `interactive' is actually a declaration rather than a function;
57 it tells `call-interactively' how to read arguments
58 to pass to the function.
59When actually called, `interactive' just returns nil.
60
f9257eed
AM
61Usually the argument of `interactive' is a string containing a code letter
62 followed optionally by a prompt. (Some code letters do not use I/O to get
63 the argument and do not use prompts.) To get several arguments, concatenate
64 the individual strings, separating them by newline characters.
65Prompts are passed to format, and may use % escapes to print the
fdb82f93
PJ
66 arguments that have already been read.
67If the argument is not a string, it is evaluated to get a list of
68 arguments to pass to the function.
69Just `(interactive)' means pass no args when calling interactively.
70
71Code letters available are:
72a -- Function name: symbol with a function definition.
73b -- Name of existing buffer.
74B -- Name of buffer, possibly nonexistent.
75c -- Character (no input method is used).
76C -- Command name: symbol with interactive function definition.
77d -- Value of point as number. Does not do I/O.
78D -- Directory name.
79e -- Parametrized event (i.e., one that's a list) that invoked this command.
80 If used more than once, the Nth `e' returns the Nth parameterized event.
81 This skips events that are integers or symbols.
82f -- Existing file name.
83F -- Possibly nonexistent file name.
75f9fbe8 84G -- Possibly nonexistent file name, defaulting to just directory name.
fdb82f93
PJ
85i -- Ignored, i.e. always nil. Does not do I/O.
86k -- Key sequence (downcase the last event if needed to get a definition).
87K -- Key sequence to be redefined (do not downcase the last event).
88m -- Value of mark as number. Does not do I/O.
89M -- Any string. Inherits the current input method.
90n -- Number read using minibuffer.
425b457e 91N -- Numeric prefix arg, or if none, do like code `n'.
fdb82f93
PJ
92p -- Prefix arg converted to number. Does not do I/O.
93P -- Prefix arg in raw form. Does not do I/O.
94r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.
95s -- Any string. Does not inherit the current input method.
96S -- Any symbol.
39900c4e 97U -- Mouse up event discarded by a previous k or K argument.
fdb82f93
PJ
98v -- Variable name: symbol that is user-variable-p.
99x -- Lisp expression read but not evaluated.
100X -- Lisp expression read and evaluated.
101z -- Coding system.
102Z -- Coding system, nil if no prefix arg.
9bdb1538
CY
103
104In addition, if the string begins with `*', an error is signaled if
105 the buffer is read-only.
106If the string begins with `@', Emacs searches the key sequence which
107 invoked the command for its first mouse click (or any other event
108 which specifies a window).
109If the string begins with `^' and `shift-select-mode' is non-nil,
2a4f8d3d 110 Emacs first calls the function `handle-shift-selection'.
9bdb1538
CY
111You may use `@', `*', and `^' together. They are processed in the
112 order that they appear, before reading any arguments.
d88bee5a 113usage: (interactive &optional ARGS) */)
5842a27b 114 (Lisp_Object args)
ec28a64d
MB
115{
116 return Qnil;
117}
118
119/* Quotify EXP: if EXP is constant, return it.
120 If EXP is not constant, return (quote EXP). */
b1349114 121static Lisp_Object
971de7fb 122quotify_arg (register Lisp_Object exp)
ec28a64d 123{
6e54b3de 124 if (!INTEGERP (exp) && !STRINGP (exp)
265a9e55 125 && !NILP (exp) && !EQ (exp, Qt))
ec28a64d
MB
126 return Fcons (Qquote, Fcons (exp, Qnil));
127
128 return exp;
129}
130
131/* Modify EXP by quotifying each element (except the first). */
b1349114 132static Lisp_Object
971de7fb 133quotify_args (Lisp_Object exp)
ec28a64d
MB
134{
135 register Lisp_Object tail;
7539e11f
KR
136 Lisp_Object next;
137 for (tail = exp; CONSP (tail); tail = next)
ec28a64d 138 {
7539e11f 139 next = XCDR (tail);
f3fbd155 140 XSETCAR (tail, quotify_arg (XCAR (tail)));
ec28a64d
MB
141 }
142 return exp;
143}
144
648801d1 145static const char *callint_argfuns[]
ec28a64d
MB
146 = {"", "point", "mark", "region-beginning", "region-end"};
147
148static void
971de7fb 149check_mark (int for_region)
ec28a64d 150{
86c1cf23 151 Lisp_Object tem;
4b4deea2 152 tem = Fmarker_buffer (BVAR (current_buffer, mark));
265a9e55 153 if (NILP (tem) || (XBUFFER (tem) != current_buffer))
f203cf07
RS
154 error (for_region ? "The mark is not set now, so there is no region"
155 : "The mark is not set now");
6497d2d8 156 if (!NILP (Vtransient_mark_mode) && NILP (Vmark_even_if_inactive)
4b4deea2 157 && NILP (BVAR (current_buffer, mark_active)))
f439241f 158 xsignal0 (Qmark_inactive);
ec28a64d
MB
159}
160
64ea14d3
RS
161/* If the list of args INPUT was produced with an explicit call to
162 `list', look for elements that were computed with
163 (region-beginning) or (region-end), and put those expressions into
164 VALUES instead of the present values.
165
166 This function doesn't return a value because it modifies elements
167 of VALUES to do its job. */
168
d1135afc 169static void
971de7fb 170fix_command (Lisp_Object input, Lisp_Object values)
d1135afc 171{
d1135afc
JB
172 if (CONSP (input))
173 {
174 Lisp_Object car;
175
176 car = XCAR (input);
177 /* Skip through certain special forms. */
178 while (EQ (car, Qlet) || EQ (car, Qletx)
179 || EQ (car, Qsave_excursion)
180 || EQ (car, Qprogn))
181 {
182 while (CONSP (XCDR (input)))
183 input = XCDR (input);
184 input = XCAR (input);
185 if (!CONSP (input))
186 break;
187 car = XCAR (input);
188 }
189 if (EQ (car, Qlist))
190 {
191 Lisp_Object intail, valtail;
192 for (intail = Fcdr (input), valtail = values;
193 CONSP (valtail);
5dc05618 194 intail = Fcdr (intail), valtail = XCDR (valtail))
d1135afc
JB
195 {
196 Lisp_Object elt;
197 elt = Fcar (intail);
198 if (CONSP (elt))
199 {
200 Lisp_Object presflag, carelt;
201 carelt = Fcar (elt);
202 /* If it is (if X Y), look at Y. */
203 if (EQ (carelt, Qif)
204 && EQ (Fnthcdr (make_number (3), elt), Qnil))
205 elt = Fnth (make_number (2), elt);
206 /* If it is (when ... Y), look at Y. */
207 else if (EQ (carelt, Qwhen))
208 {
209 while (CONSP (XCDR (elt)))
210 elt = XCDR (elt);
211 elt = Fcar (elt);
212 }
213
214 /* If the function call we're looking at
215 is a special preserved one, copy the
216 whole expression for this argument. */
217 if (CONSP (elt))
218 {
219 presflag = Fmemq (Fcar (elt), preserved_fns);
220 if (!NILP (presflag))
221 Fsetcar (valtail, Fcar (intail));
222 }
223 }
224 }
225 }
226 }
227}
ec28a64d 228
d455db8e 229DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0,
fdb82f93
PJ
230 doc: /* Call FUNCTION, reading args according to its interactive calling specs.
231Return the value FUNCTION returns.
232The function contains a specification of how to do the argument reading.
233In the case of user-defined functions, this is specified by placing a call
234to the function `interactive' at the top level of the function body.
235See `interactive'.
236
237Optional second arg RECORD-FLAG non-nil
238means unconditionally put this command in the command-history.
239Otherwise, this is done only if an arg is read using the minibuffer.
2a95a27c 240
fdb82f93 241Optional third arg KEYS, if given, specifies the sequence of events to
2a95a27c
CY
242supply, as a vector, if the command inquires which events were used to
243invoke it. If KEYS is omitted or nil, the return value of
244`this-command-keys-vector' is used. */)
5842a27b 245 (Lisp_Object function, Lisp_Object record_flag, Lisp_Object keys)
ec28a64d
MB
246{
247 Lisp_Object *args, *visargs;
ec28a64d 248 Lisp_Object specs;
079e479f 249 Lisp_Object filter_specs;
ec28a64d 250 Lisp_Object teml;
39900c4e 251 Lisp_Object up_event;
52614803 252 Lisp_Object enable;
aed13378 253 int speccount = SPECPDL_INDEX ();
ec28a64d 254
bc78232c
JB
255 /* The index of the next element of this_command_keys to examine for
256 the 'e' interactive code. */
dbc4e1c1 257 int next_event;
bc78232c 258
ec28a64d 259 Lisp_Object prefix_arg;
a2db9982 260 char *string;
b0e80955 261 const char *tem;
63007de2
JB
262
263 /* If varies[i] > 0, the i'th argument shouldn't just have its value
264 in this call quoted in the command history. It should be
265 recorded as a call to the function named callint_argfuns[varies[i]]. */
ec28a64d 266 int *varies;
63007de2 267
ec28a64d
MB
268 register int i, j;
269 int count, foo;
ec28a64d
MB
270 char prompt1[100];
271 char *tem1;
272 int arg_from_tty = 0;
39900c4e 273 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
d455db8e 274 int key_count;
09c886dc 275 int record_then_fail = 0;
d455db8e 276
0605dd79
RS
277 Lisp_Object save_this_command, save_last_command;
278 Lisp_Object save_this_original_command, save_real_this_command;
279
280 save_this_command = Vthis_command;
281 save_this_original_command = Vthis_original_command;
282 save_real_this_command = real_this_command;
1344aad4 283 save_last_command = KVAR (current_kboard, Vlast_command);
0605dd79 284
d455db8e
RS
285 if (NILP (keys))
286 keys = this_command_keys, key_count = this_command_key_count;
287 else
288 {
b7826503 289 CHECK_VECTOR (keys);
d455db8e
RS
290 key_count = XVECTOR (keys)->size;
291 }
ec28a64d 292
e5d77022 293 /* Save this now, since use of minibuffer will clobber it. */
8c917bf2 294 prefix_arg = Vcurrent_prefix_arg;
ec28a64d 295
6e54b3de 296 if (SYMBOLP (function))
afa4c0f3 297 enable = Fget (function, Qenable_recursive_minibuffers);
4f895918
GM
298 else
299 enable = Qnil;
52614803 300
ec28a64d
MB
301 specs = Qnil;
302 string = 0;
079e479f
RS
303 /* The idea of FILTER_SPECS is to provide away to
304 specify how to represent the arguments in command history.
305 The feature is not fully implemented. */
306 filter_specs = Qnil;
ec28a64d 307
39900c4e
KS
308 /* If k or K discard an up-event, save it here so it can be retrieved with U */
309 up_event = Qnil;
310
ccb5c14f 311 /* Set SPECS to the interactive form, or barf if not interactive. */
023accd6
SM
312 {
313 Lisp_Object form;
314 GCPRO2 (function, prefix_arg);
315 form = Finteractive_form (function);
316 UNGCPRO;
317 if (CONSP (form))
318 specs = filter_specs = Fcar (XCDR (form));
319 else
320 wrong_type_argument (Qcommandp, function);
321 }
ec28a64d 322
ccb5c14f 323 /* If SPECS is set to a string, use it as an interactive prompt. */
6e54b3de 324 if (STRINGP (specs))
46947372
JB
325 {
326 /* Make a copy of string so that if a GC relocates specs,
327 `string' will still be valid. */
a2db9982
PE
328 string = (char *) alloca (SBYTES (specs) + 1);
329 memcpy (string, SSDATA (specs), SBYTES (specs) + 1);
46947372 330 }
023accd6 331 else
ec28a64d 332 {
03e130d5 333 Lisp_Object input;
91a6ba78 334 i = num_input_events;
03e130d5
RS
335 input = specs;
336 /* Compute the arg values using the user's expression. */
079e479f 337 GCPRO2 (input, filter_specs);
6bc1abf2 338 specs = Feval (specs);
079e479f 339 UNGCPRO;
91a6ba78 340 if (i != num_input_events || !NILP (record_flag))
03e130d5
RS
341 {
342 /* We should record this command on the command history. */
f1321dc3 343 Lisp_Object values;
d65859c3 344 Lisp_Object this_cmd;
03e130d5
RS
345 /* Make a copy of the list of values, for the command history,
346 and turn them into things we can eval. */
347 values = quotify_args (Fcopy_sequence (specs));
120d0a23 348 fix_command (input, values);
d65859c3
DN
349 this_cmd = Fcons (function, values);
350 if (history_delete_duplicates)
351 Vcommand_history = Fdelete (this_cmd, Vcommand_history);
352 Vcommand_history = Fcons (this_cmd, Vcommand_history);
225c2157
RS
353
354 /* Don't keep command history around forever. */
b9f0b172 355 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
356 {
357 teml = Fnthcdr (Vhistory_length, Vcommand_history);
358 if (CONSP (teml))
f3fbd155 359 XSETCDR (teml, Qnil);
225c2157 360 }
03e130d5 361 }
0605dd79
RS
362
363 Vthis_command = save_this_command;
364 Vthis_original_command = save_this_original_command;
365 real_this_command= save_real_this_command;
1344aad4 366 KVAR (current_kboard, Vlast_command) = save_last_command;
0605dd79 367
256c9c3a
KL
368 temporarily_switch_to_single_kboard (NULL);
369 return unbind_to (speccount, apply1 (function, specs));
ec28a64d
MB
370 }
371
372 /* Here if function specifies a string to control parsing the defaults */
373
dbc4e1c1 374 /* Set next_event to point to the first event with parameters. */
d455db8e 375 for (next_event = 0; next_event < key_count; next_event++)
1b511542 376 if (EVENT_HAS_PARAMETERS (AREF (keys, next_event)))
dbc4e1c1 377 break;
09c886dc 378
42bb2790 379 /* Handle special starting chars `*' and `@'. Also `-'. */
e92d107b 380 /* Note that `+' is reserved for user extensions. */
ec28a64d
MB
381 while (1)
382 {
fb775602 383 if (*string == '+')
e92d107b
RS
384 error ("`+' is not used in `interactive' for ordinary commands");
385 else if (*string == '*')
ec28a64d
MB
386 {
387 string++;
4b4deea2 388 if (!NILP (BVAR (current_buffer, read_only)))
09c886dc
RS
389 {
390 if (!NILP (record_flag))
391 {
a2db9982 392 char *p = string;
09c886dc
RS
393 while (*p)
394 {
395 if (! (*p == 'r' || *p == 'p' || *p == 'P'
396 || *p == '\n'))
397 Fbarf_if_buffer_read_only ();
398 p++;
399 }
400 record_then_fail = 1;
401 }
402 else
403 Fbarf_if_buffer_read_only ();
404 }
ec28a64d 405 }
42bb2790
RS
406 /* Ignore this for semi-compatibility with Lucid. */
407 else if (*string == '-')
408 string++;
ec28a64d
MB
409 else if (*string == '@')
410 {
a3e8cbda 411 Lisp_Object event, w;
dbc4e1c1 412
170d3006 413 event = (next_event < key_count
1b511542 414 ? AREF (keys, next_event)
170d3006 415 : Qnil);
dbc4e1c1 416 if (EVENT_HAS_PARAMETERS (event)
a3e8cbda
PE
417 && (w = XCDR (event), CONSP (w))
418 && (w = XCAR (w), CONSP (w))
419 && (w = XCAR (w), WINDOWP (w)))
d1fa2e8a 420 {
a3e8cbda
PE
421 if (MINI_WINDOW_P (XWINDOW (w))
422 && ! (minibuf_level > 0 && EQ (w, minibuf_window)))
d1fa2e8a 423 error ("Attempt to select inactive minibuffer window");
ef2515c0
RS
424
425 /* If the current buffer wants to clean up, let it. */
426 if (!NILP (Vmouse_leave_buffer_hook))
427 call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
428
a3e8cbda 429 Fselect_window (w, Qnil);
d1fa2e8a 430 }
ec28a64d 431 string++;
ec28a64d 432 }
9bdb1538
CY
433 else if (*string == '^')
434 {
84db11d6 435 call0 (Qhandle_shift_selection);
9bdb1538
CY
436 string++;
437 }
ec28a64d
MB
438 else break;
439 }
440
441 /* Count the number of arguments the interactive spec would have
442 us give to the function. */
443 tem = string;
e4305426 444 for (j = 0; *tem;)
ec28a64d
MB
445 {
446 /* 'r' specifications ("point and mark as 2 numeric args")
447 produce *two* arguments. */
e4305426
DK
448 if (*tem == 'r')
449 j += 2;
450 else
451 j++;
a2db9982 452 tem = strchr (tem, '\n');
ec28a64d 453 if (tem)
e4305426 454 ++tem;
ec28a64d 455 else
e4305426 456 break;
ec28a64d 457 }
6bc1abf2 458 count = j;
ec28a64d
MB
459
460 args = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
461 visargs = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
ec28a64d
MB
462 varies = (int *) alloca ((count + 1) * sizeof (int));
463
464 for (i = 0; i < (count + 1); i++)
465 {
466 args[i] = Qnil;
467 visargs[i] = Qnil;
468 varies[i] = 0;
469 }
470
39900c4e 471 GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
ec28a64d
MB
472 gcpro3.nvars = (count + 1);
473 gcpro4.nvars = (count + 1);
474
52614803
RS
475 if (!NILP (enable))
476 specbind (Qenable_recursive_minibuffers, Qt);
477
ec28a64d 478 tem = string;
6bc1abf2 479 for (i = 1; *tem; i++)
ec28a64d
MB
480 {
481 strncpy (prompt1, tem + 1, sizeof prompt1 - 1);
482 prompt1[sizeof prompt1 - 1] = 0;
8966b757 483 tem1 = strchr (prompt1, '\n');
ec28a64d 484 if (tem1) *tem1 = 0;
55b41ef5
CY
485
486 visargs[0] = build_string (prompt1);
8966b757 487 if (strchr (prompt1, '%'))
55b41ef5
CY
488 callint_message = Fformat (i, visargs);
489 else
490 callint_message = visargs[0];
ec28a64d
MB
491
492 switch (*tem)
493 {
494 case 'a': /* Symbol defined as a function */
55b41ef5 495 visargs[i] = Fcompleting_read (callint_message,
ff9cd111 496 Vobarray, Qfboundp, Qt,
93fb51ae 497 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
498 /* Passing args[i] directly stimulates compiler bug */
499 teml = visargs[i];
500 args[i] = Fintern (teml, Qnil);
501 break;
502
503 case 'b': /* Name of existing buffer */
f03f8f2c
JL
504 args[i] = Fcurrent_buffer ();
505 if (EQ (selected_window, minibuf_window))
506 args[i] = Fother_buffer (args[i], Qnil, Qnil);
507 args[i] = Fread_buffer (callint_message, args[i], Qt);
508 break;
509
ec28a64d 510 case 'B': /* Name of buffer, possibly nonexistent */
f03f8f2c
JL
511 args[i] = Fread_buffer (callint_message,
512 Fother_buffer (Fcurrent_buffer (), Qnil, Qnil),
513 Qnil);
ec28a64d
MB
514 break;
515
516 case 'c': /* Character */
54b33868
MR
517 /* Prompt in `minibuffer-prompt' face. */
518 Fput_text_property (make_number (0),
519 make_number (SCHARS (callint_message)),
520 Qface, Qminibuffer_prompt, callint_message);
55b41ef5 521 args[i] = Fread_char (callint_message, Qnil, Qnil);
453ed650 522 message1_nolog ((char *) 0);
ec28a64d
MB
523 /* Passing args[i] directly stimulates compiler bug */
524 teml = args[i];
525 visargs[i] = Fchar_to_string (teml);
526 break;
527
528 case 'C': /* Command: symbol with interactive function */
55b41ef5 529 visargs[i] = Fcompleting_read (callint_message,
ff9cd111 530 Vobarray, Qcommandp,
93fb51ae 531 Qt, Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
532 /* Passing args[i] directly stimulates compiler bug */
533 teml = visargs[i];
534 args[i] = Fintern (teml, Qnil);
535 break;
536
537 case 'd': /* Value of point. Does not do I/O. */
dc330139 538 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
824977b6 539 args[i] = point_marker;
ec28a64d
MB
540 /* visargs[i] = Qnil; */
541 varies[i] = 1;
542 break;
543
ec28a64d 544 case 'D': /* Directory name. */
55b41ef5 545 args[i] = Fread_file_name (callint_message, Qnil,
4b4deea2 546 BVAR (current_buffer, directory), Qlambda, Qnil,
93ed5f9d 547 Qfile_directory_p);
ec28a64d
MB
548 break;
549
550 case 'f': /* Existing file name. */
55b41ef5 551 args[i] = Fread_file_name (callint_message,
93ed5f9d 552 Qnil, Qnil, Qlambda, Qnil, Qnil);
ec28a64d
MB
553 break;
554
555 case 'F': /* Possibly nonexistent file name. */
55b41ef5 556 args[i] = Fread_file_name (callint_message,
93ed5f9d 557 Qnil, Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
558 break;
559
75f9fbe8
RS
560 case 'G': /* Possibly nonexistent file name,
561 default to directory alone. */
55b41ef5 562 args[i] = Fread_file_name (callint_message,
977f6cfb 563 Qnil, Qnil, Qnil, empty_unibyte_string, Qnil);
75f9fbe8
RS
564 break;
565
40b2421c
KH
566 case 'i': /* Ignore an argument -- Does not do I/O */
567 varies[i] = -1;
568 break;
569
1989e7bc 570 case 'k': /* Key sequence. */
c631c234 571 {
aed13378 572 int speccount1 = SPECPDL_INDEX ();
c631c234 573 specbind (Qcursor_in_echo_area, Qt);
54b33868
MR
574 /* Prompt in `minibuffer-prompt' face. */
575 Fput_text_property (make_number (0),
576 make_number (SCHARS (callint_message)),
577 Qface, Qminibuffer_prompt, callint_message);
55b41ef5 578 args[i] = Fread_key_sequence (callint_message,
ad4ac475 579 Qnil, Qnil, Qnil, Qnil);
c631c234
RS
580 unbind_to (speccount1, Qnil);
581 teml = args[i];
a1bfe073 582 visargs[i] = Fkey_description (teml, Qnil);
cdfac812
RS
583
584 /* If the key sequence ends with a down-event,
585 discard the following up-event. */
586 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
587 if (CONSP (teml))
70949dac 588 teml = XCAR (teml);
cdfac812
RS
589 if (SYMBOLP (teml))
590 {
591 Lisp_Object tem2;
592
593 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
594 /* Ignore first element, which is the base key. */
595 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 596 if (! NILP (tem2))
43811b4e 597 up_event = Fread_event (Qnil, Qnil, Qnil);
cdfac812 598 }
c631c234 599 }
1989e7bc
RS
600 break;
601
602 case 'K': /* Key sequence to be defined. */
c631c234 603 {
aed13378 604 int speccount1 = SPECPDL_INDEX ();
c631c234 605 specbind (Qcursor_in_echo_area, Qt);
54b33868
MR
606 /* Prompt in `minibuffer-prompt' face. */
607 Fput_text_property (make_number (0),
608 make_number (SCHARS (callint_message)),
609 Qface, Qminibuffer_prompt, callint_message);
55b41ef5 610 args[i] = Fread_key_sequence (callint_message,
ad4ac475 611 Qnil, Qt, Qnil, Qnil);
c631c234 612 teml = args[i];
a1bfe073 613 visargs[i] = Fkey_description (teml, Qnil);
c631c234 614 unbind_to (speccount1, Qnil);
cdfac812
RS
615
616 /* If the key sequence ends with a down-event,
617 discard the following up-event. */
618 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
619 if (CONSP (teml))
70949dac 620 teml = XCAR (teml);
cdfac812
RS
621 if (SYMBOLP (teml))
622 {
623 Lisp_Object tem2;
624
625 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
626 /* Ignore first element, which is the base key. */
627 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 628 if (! NILP (tem2))
43811b4e 629 up_event = Fread_event (Qnil, Qnil, Qnil);
cdfac812 630 }
c631c234 631 }
ec28a64d
MB
632 break;
633
39900c4e
KS
634 case 'U': /* Up event from last k or K */
635 if (!NILP (up_event))
636 {
637 args[i] = Fmake_vector (make_number (1), up_event);
638 up_event = Qnil;
639 teml = args[i];
640 visargs[i] = Fkey_description (teml, Qnil);
641 }
642 break;
643
bc78232c 644 case 'e': /* The invoking event. */
d455db8e 645 if (next_event >= key_count)
bc78232c 646 error ("%s must be bound to an event with parameters",
6e54b3de 647 (SYMBOLP (function)
51b59d79 648 ? SSDATA (SYMBOL_NAME (function))
bc78232c 649 : "command"));
1b511542
SM
650 args[i] = AREF (keys, next_event);
651 next_event++;
e5d77022 652 varies[i] = -1;
dbc4e1c1
JB
653
654 /* Find the next parameterized event. */
d455db8e 655 while (next_event < key_count
1b511542 656 && !(EVENT_HAS_PARAMETERS (AREF (keys, next_event))))
dbc4e1c1
JB
657 next_event++;
658
63007de2
JB
659 break;
660
ec28a64d 661 case 'm': /* Value of mark. Does not do I/O. */
f203cf07 662 check_mark (0);
ec28a64d 663 /* visargs[i] = Qnil; */
4b4deea2 664 args[i] = BVAR (current_buffer, mark);
ec28a64d
MB
665 varies[i] = 2;
666 break;
667
93fb51ae
KH
668 case 'M': /* String read via minibuffer with
669 inheriting the current input method. */
55b41ef5 670 args[i] = Fread_string (callint_message,
93fb51ae
KH
671 Qnil, Qnil, Qnil, Qt);
672 break;
673
425b457e 674 case 'N': /* Prefix arg as number, else number from minibuffer */
265a9e55 675 if (!NILP (prefix_arg))
ec28a64d
MB
676 goto have_prefix_arg;
677 case 'n': /* Read number from minibuffer. */
f0490a0b
RS
678 {
679 int first = 1;
680 do
681 {
a3e8cbda 682 Lisp_Object str;
e7c4e229 683 if (! first)
f0490a0b
RS
684 {
685 message ("Please enter a number.");
e7c4e229 686 sit_for (make_number (1), 0, 0);
f0490a0b
RS
687 }
688 first = 0;
689
a3e8cbda 690 str = Fread_from_minibuffer (callint_message,
93fb51ae 691 Qnil, Qnil, Qnil, Qnil, Qnil,
ae4c2a3b 692 Qnil);
a3e8cbda 693 if (! STRINGP (str) || SCHARS (str) == 0)
f0490a0b
RS
694 args[i] = Qnil;
695 else
a3e8cbda 696 args[i] = Fread (str);
f0490a0b
RS
697 }
698 while (! NUMBERP (args[i]));
699 }
55b41ef5 700 visargs[i] = args[i];
ec28a64d
MB
701 break;
702
703 case 'P': /* Prefix arg in raw form. Does no I/O. */
ec28a64d
MB
704 args[i] = prefix_arg;
705 /* visargs[i] = Qnil; */
706 varies[i] = -1;
707 break;
708
709 case 'p': /* Prefix arg converted to number. No I/O. */
71eda2d5 710 have_prefix_arg:
ec28a64d
MB
711 args[i] = Fprefix_numeric_value (prefix_arg);
712 /* visargs[i] = Qnil; */
713 varies[i] = -1;
714 break;
715
716 case 'r': /* Region, point and mark as 2 args. */
f203cf07 717 check_mark (1);
dc330139 718 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
ec28a64d 719 /* visargs[i+1] = Qnil; */
4b4deea2 720 foo = marker_position (BVAR (current_buffer, mark));
ec28a64d 721 /* visargs[i] = Qnil; */
4b4deea2 722 args[i] = PT < foo ? point_marker : BVAR (current_buffer, mark);
ec28a64d 723 varies[i] = 3;
4b4deea2 724 args[++i] = PT > foo ? point_marker : BVAR (current_buffer, mark);
ec28a64d
MB
725 varies[i] = 4;
726 break;
727
93fb51ae
KH
728 case 's': /* String read via minibuffer without
729 inheriting the current input method. */
55b41ef5 730 args[i] = Fread_string (callint_message,
93fb51ae 731 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
732 break;
733
734 case 'S': /* Any symbol. */
55b41ef5 735 visargs[i] = Fread_string (callint_message,
93fb51ae 736 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
737 /* Passing args[i] directly stimulates compiler bug */
738 teml = visargs[i];
739 args[i] = Fintern (teml, Qnil);
740 break;
741
742 case 'v': /* Variable name: symbol that is
743 user-variable-p. */
55b41ef5 744 args[i] = Fread_variable (callint_message, Qnil);
ec28a64d
MB
745 visargs[i] = last_minibuf_string;
746 break;
747
748 case 'x': /* Lisp expression read but not evaluated */
55b41ef5 749 args[i] = Fread_minibuffer (callint_message, Qnil);
ec28a64d
MB
750 visargs[i] = last_minibuf_string;
751 break;
752
753 case 'X': /* Lisp expression read and evaluated */
55b41ef5 754 args[i] = Feval_minibuffer (callint_message, Qnil);
ec28a64d
MB
755 visargs[i] = last_minibuf_string;
756 break;
757
40b2421c
KH
758 case 'Z': /* Coding-system symbol, or ignore the
759 argument if no prefix */
760 if (NILP (prefix_arg))
761 {
762 args[i] = Qnil;
763 varies[i] = -1;
764 }
177c0ea7 765 else
40b2421c
KH
766 {
767 args[i]
55b41ef5 768 = Fread_non_nil_coding_system (callint_message);
40b2421c
KH
769 visargs[i] = last_minibuf_string;
770 }
771 break;
772
773 case 'z': /* Coding-system symbol or nil */
55b41ef5 774 args[i] = Fread_coding_system (callint_message, Qnil);
40b2421c
KH
775 visargs[i] = last_minibuf_string;
776 break;
777
e92d107b
RS
778 /* We have a case for `+' so we get an error
779 if anyone tries to define one here. */
780 case '+':
ec28a64d 781 default:
e92d107b 782 error ("Invalid control letter `%c' (%03o) in interactive calling string",
a2db9982 783 *tem, (unsigned char) *tem);
ec28a64d
MB
784 }
785
786 if (varies[i] == 0)
787 arg_from_tty = 1;
788
6e54b3de 789 if (NILP (visargs[i]) && STRINGP (args[i]))
ec28a64d
MB
790 visargs[i] = args[i];
791
a2db9982 792 tem = strchr (tem, '\n');
ec28a64d 793 if (tem) tem++;
a2db9982 794 else tem = "";
ec28a64d 795 }
52614803 796 unbind_to (speccount, Qnil);
ec28a64d
MB
797
798 QUIT;
799
800 args[0] = function;
801
7868a977 802 if (arg_from_tty || !NILP (record_flag))
ec28a64d
MB
803 {
804 visargs[0] = function;
63007de2 805 for (i = 1; i < count + 1; i++)
824977b6
RS
806 {
807 if (varies[i] > 0)
808 visargs[i] = Fcons (intern (callint_argfuns[varies[i]]), Qnil);
809 else
810 visargs[i] = quotify_arg (args[i]);
811 }
ec28a64d
MB
812 Vcommand_history = Fcons (Flist (count + 1, visargs),
813 Vcommand_history);
225c2157 814 /* Don't keep command history around forever. */
b9f0b172 815 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
816 {
817 teml = Fnthcdr (Vhistory_length, Vcommand_history);
818 if (CONSP (teml))
f3fbd155 819 XSETCDR (teml, Qnil);
225c2157 820 }
ec28a64d
MB
821 }
822
824977b6
RS
823 /* If we used a marker to hold point, mark, or an end of the region,
824 temporarily, convert it to an integer now. */
f4c8ded2 825 for (i = 1; i <= count; i++)
824977b6
RS
826 if (varies[i] >= 1 && varies[i] <= 4)
827 XSETINT (args[i], marker_position (args[i]));
828
09c886dc
RS
829 if (record_then_fail)
830 Fbarf_if_buffer_read_only ();
831
0605dd79
RS
832 Vthis_command = save_this_command;
833 Vthis_original_command = save_this_original_command;
834 real_this_command= save_real_this_command;
1344aad4 835 KVAR (current_kboard, Vlast_command) = save_last_command;
0605dd79 836
ec28a64d
MB
837 {
838 Lisp_Object val;
ec28a64d
MB
839 specbind (Qcommand_debug_status, Qnil);
840
b3e6f69c 841 temporarily_switch_to_single_kboard (NULL);
ec28a64d
MB
842 val = Ffuncall (count + 1, args);
843 UNGCPRO;
844 return unbind_to (speccount, val);
845 }
177c0ea7 846}
ec28a64d
MB
847
848DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
fdb82f93
PJ
849 1, 1, 0,
850 doc: /* Return numeric meaning of raw prefix argument RAW.
851A raw prefix argument is what you get from `(interactive "P")'.
852Its numeric meaning is what you would get from `(interactive "p")'. */)
5842a27b 853 (Lisp_Object raw)
ec28a64d
MB
854{
855 Lisp_Object val;
177c0ea7 856
265a9e55 857 if (NILP (raw))
acab6442 858 XSETFASTINT (val, 1);
fd5285f3 859 else if (EQ (raw, Qminus))
ec28a64d 860 XSETINT (val, -1);
70949dac
KR
861 else if (CONSP (raw) && INTEGERP (XCAR (raw)))
862 XSETINT (val, XINT (XCAR (raw)));
6e54b3de 863 else if (INTEGERP (raw))
ec28a64d
MB
864 val = raw;
865 else
acab6442 866 XSETFASTINT (val, 1);
ec28a64d
MB
867
868 return val;
869}
870
dfcf069d 871void
971de7fb 872syms_of_callint (void)
ec28a64d 873{
824977b6
RS
874 point_marker = Fmake_marker ();
875 staticpro (&point_marker);
876
55b41ef5
CY
877 callint_message = Qnil;
878 staticpro (&callint_message);
879
d67b4f80
DN
880 preserved_fns = pure_cons (intern_c_string ("region-beginning"),
881 pure_cons (intern_c_string ("region-end"),
882 pure_cons (intern_c_string ("point"),
883 pure_cons (intern_c_string ("mark"), Qnil))));
03e130d5 884
d67b4f80 885 Qlist = intern_c_string ("list");
03e130d5 886 staticpro (&Qlist);
d67b4f80 887 Qlet = intern_c_string ("let");
8450690a 888 staticpro (&Qlet);
d67b4f80 889 Qif = intern_c_string ("if");
120d0a23 890 staticpro (&Qif);
d67b4f80 891 Qwhen = intern_c_string ("when");
120d0a23 892 staticpro (&Qwhen);
d67b4f80 893 Qletx = intern_c_string ("let*");
8450690a 894 staticpro (&Qletx);
d67b4f80 895 Qsave_excursion = intern_c_string ("save-excursion");
8450690a 896 staticpro (&Qsave_excursion);
d67b4f80 897 Qprogn = intern_c_string ("progn");
079e479f 898 staticpro (&Qprogn);
03e130d5 899
d67b4f80 900 Qminus = intern_c_string ("-");
ec28a64d
MB
901 staticpro (&Qminus);
902
d67b4f80 903 Qplus = intern_c_string ("+");
fdb4a38c
RS
904 staticpro (&Qplus);
905
d67b4f80 906 Qhandle_shift_selection = intern_c_string ("handle-shift-selection");
9bdb1538
CY
907 staticpro (&Qhandle_shift_selection);
908
d67b4f80 909 Qcall_interactively = intern_c_string ("call-interactively");
ec28a64d
MB
910 staticpro (&Qcall_interactively);
911
d67b4f80 912 Qcommand_debug_status = intern_c_string ("command-debug-status");
ec28a64d
MB
913 staticpro (&Qcommand_debug_status);
914
d67b4f80 915 Qenable_recursive_minibuffers = intern_c_string ("enable-recursive-minibuffers");
52614803
RS
916 staticpro (&Qenable_recursive_minibuffers);
917
d67b4f80 918 Qmouse_leave_buffer_hook = intern_c_string ("mouse-leave-buffer-hook");
ef2515c0
RS
919 staticpro (&Qmouse_leave_buffer_hook);
920
1e0c5826 921 DEFVAR_KBOARD ("prefix-arg", Vprefix_arg,
fdb82f93
PJ
922 doc: /* The value of the prefix argument for the next editing command.
923It may be a number, or the symbol `-' for just a minus sign as arg,
924or a list whose car is a number for just one or more C-u's
925or nil if no argument has been specified.
926
927You cannot examine this variable to find the argument for this command
928since it has been set to nil by the time you can look.
929Instead, you should use the variable `current-prefix-arg', although
930normally commands can get this prefix argument with (interactive "P"). */);
8c917bf2 931
fe3fbdcc 932 DEFVAR_KBOARD ("last-prefix-arg", Vlast_prefix_arg,
fdb82f93
PJ
933 doc: /* The value of the prefix argument for the previous editing command.
934See `prefix-arg' for the meaning of the value. */);
fe3fbdcc 935
29208e82 936 DEFVAR_LISP ("current-prefix-arg", Vcurrent_prefix_arg,
fdb82f93
PJ
937 doc: /* The value of the prefix argument for this editing command.
938It may be a number, or the symbol `-' for just a minus sign as arg,
939or a list whose car is a number for just one or more C-u's
940or nil if no argument has been specified.
941This is what `(interactive \"P\")' returns. */);
8c917bf2
KH
942 Vcurrent_prefix_arg = Qnil;
943
29208e82 944 DEFVAR_LISP ("command-history", Vcommand_history,
fdb82f93 945 doc: /* List of recent commands that read arguments from terminal.
b014713c
EZ
946Each command is represented as a form to evaluate.
947
948Maximum length of the history list is determined by the value
949of `history-length', which see. */);
ec28a64d
MB
950 Vcommand_history = Qnil;
951
29208e82 952 DEFVAR_LISP ("command-debug-status", Vcommand_debug_status,
fdb82f93
PJ
953 doc: /* Debugging status of current interactive command.
954Bound each time `call-interactively' is called;
955may be set by the debugger as a reminder for itself. */);
ec28a64d
MB
956 Vcommand_debug_status = Qnil;
957
29208e82 958 DEFVAR_LISP ("mark-even-if-inactive", Vmark_even_if_inactive,
fdb82f93
PJ
959 doc: /* *Non-nil means you can use the mark even when inactive.
960This option makes a difference in Transient Mark mode.
961When the option is non-nil, deactivation of the mark
962turns off region highlighting, but commands that use the mark
963behave as if the mark were still active. */);
a2b84f35 964 Vmark_even_if_inactive = Qt;
9f315aeb 965
29208e82 966 DEFVAR_LISP ("mouse-leave-buffer-hook", Vmouse_leave_buffer_hook,
fdb82f93
PJ
967 doc: /* Hook to run when about to switch windows with a mouse command.
968Its purpose is to give temporary modes such as Isearch mode
969a way to turn themselves off when a mouse command switches windows. */);
ef2515c0
RS
970 Vmouse_leave_buffer_hook = Qnil;
971
ec28a64d
MB
972 defsubr (&Sinteractive);
973 defsubr (&Scall_interactively);
974 defsubr (&Sprefix_numeric_value);
975}