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