use dynwind_begin and dynwind_end
[bpt/emacs.git] / src / callint.c
CommitLineData
ec28a64d 1/* Call a Lisp function interactively.
ba318903 2 Copyright (C) 1985-1986, 1993-1995, 1997, 2000-2014 Free Software
ab422c4d 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;
0e4857b7 32static Lisp_Object Qfuncall_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
12b1389c
DC
41static Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qif;
42Lisp_Object Qwhen, Qprogn;
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)))
6c6f1994 130 return list2 (Qquote, exp);
ec28a64d
MB
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
9dc774d4
DA
236/* Helper function to call `read-file-name' from C. */
237
238static Lisp_Object
239read_file_name (Lisp_Object default_filename, Lisp_Object mustmatch,
240 Lisp_Object initial, Lisp_Object predicate)
241{
242 struct gcpro gcpro1;
243 Lisp_Object args[7];
244
245 GCPRO1 (default_filename);
246 args[0] = intern ("read-file-name");
247 args[1] = callint_message;
248 args[2] = Qnil;
249 args[3] = default_filename;
250 args[4] = mustmatch;
251 args[5] = initial;
252 args[6] = predicate;
253 RETURN_UNGCPRO (Ffuncall (7, args));
254}
255
0e4857b7
SM
256/* BEWARE: Calling this directly from C would defeat the purpose! */
257DEFUN ("funcall-interactively", Ffuncall_interactively, Sfuncall_interactively,
258 1, MANY, 0, doc: /* Like `funcall' but marks the call as interactive.
259I.e. arrange that within the called function `called-interactively-p' will
cc304290
JB
260return non-nil.
261usage: (funcall-interactively FUNCTION &rest ARGUMENTS) */)
0e4857b7
SM
262 (ptrdiff_t nargs, Lisp_Object *args)
263{
264 ptrdiff_t speccount = SPECPDL_INDEX ();
265 temporarily_switch_to_single_kboard (NULL);
266
267 /* Nothing special to do here, all the work is inside
268 `called-interactively-p'. Which will look for us as a marker in the
269 backtrace. */
270 return unbind_to (speccount, Ffuncall (nargs, args));
271}
272
d455db8e 273DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0,
54e10184 274 doc: /* Call FUNCTION, providing args according to its interactive calling specs.
fdb82f93
PJ
275Return the value FUNCTION returns.
276The function contains a specification of how to do the argument reading.
277In the case of user-defined functions, this is specified by placing a call
278to the function `interactive' at the top level of the function body.
279See `interactive'.
280
281Optional second arg RECORD-FLAG non-nil
282means unconditionally put this command in the command-history.
283Otherwise, this is done only if an arg is read using the minibuffer.
2a95a27c 284
fdb82f93 285Optional third arg KEYS, if given, specifies the sequence of events to
2a95a27c
CY
286supply, as a vector, if the command inquires which events were used to
287invoke it. If KEYS is omitted or nil, the return value of
288`this-command-keys-vector' is used. */)
5842a27b 289 (Lisp_Object function, Lisp_Object record_flag, Lisp_Object keys)
ec28a64d 290{
07ff4ac6
SM
291 /* `args' will contain the array of arguments to pass to the function.
292 `visargs' will contain the same list but in a nicer form, so that if we
293 pass it to `Fformat' it will be understandable to a human. */
ec28a64d 294 Lisp_Object *args, *visargs;
ec28a64d 295 Lisp_Object specs;
079e479f 296 Lisp_Object filter_specs;
ec28a64d 297 Lisp_Object teml;
39900c4e 298 Lisp_Object up_event;
52614803 299 Lisp_Object enable;
2bfa3d3e 300 dynwind_begin ();
ec28a64d 301
bc78232c
JB
302 /* The index of the next element of this_command_keys to examine for
303 the 'e' interactive code. */
d311d28c 304 ptrdiff_t next_event;
bc78232c 305
ec28a64d 306 Lisp_Object prefix_arg;
a2db9982 307 char *string;
b0e80955 308 const char *tem;
63007de2
JB
309
310 /* If varies[i] > 0, the i'th argument shouldn't just have its value
311 in this call quoted in the command history. It should be
312 recorded as a call to the function named callint_argfuns[varies[i]]. */
f66c7cf8 313 signed char *varies;
63007de2 314
f66c7cf8 315 ptrdiff_t i, nargs;
2f221583
PE
316 ptrdiff_t mark;
317 bool arg_from_tty = 0;
39900c4e 318 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
d311d28c 319 ptrdiff_t key_count;
2f221583 320 bool record_then_fail = 0;
d455db8e 321
0605dd79
RS
322 Lisp_Object save_this_command, save_last_command;
323 Lisp_Object save_this_original_command, save_real_this_command;
324
325 save_this_command = Vthis_command;
326 save_this_original_command = Vthis_original_command;
f2d6a3df 327 save_real_this_command = Vreal_this_command;
1344aad4 328 save_last_command = KVAR (current_kboard, Vlast_command);
0605dd79 329
d455db8e
RS
330 if (NILP (keys))
331 keys = this_command_keys, key_count = this_command_key_count;
332 else
333 {
b7826503 334 CHECK_VECTOR (keys);
77b37c05 335 key_count = ASIZE (keys);
d455db8e 336 }
ec28a64d 337
f2d6a3df 338 /* Save this now, since use of minibuffer will clobber it. */
8c917bf2 339 prefix_arg = Vcurrent_prefix_arg;
ec28a64d 340
6e54b3de 341 if (SYMBOLP (function))
afa4c0f3 342 enable = Fget (function, Qenable_recursive_minibuffers);
4f895918
GM
343 else
344 enable = Qnil;
52614803 345
ec28a64d
MB
346 specs = Qnil;
347 string = 0;
bd21bf41 348 /* The idea of FILTER_SPECS is to provide a way to
079e479f
RS
349 specify how to represent the arguments in command history.
350 The feature is not fully implemented. */
351 filter_specs = Qnil;
ec28a64d 352
f2d6a3df
SM
353 /* If k or K discard an up-event, save it here so it can be retrieved with
354 U. */
39900c4e
KS
355 up_event = Qnil;
356
ccb5c14f 357 /* Set SPECS to the interactive form, or barf if not interactive. */
023accd6
SM
358 {
359 Lisp_Object form;
360 GCPRO2 (function, prefix_arg);
361 form = Finteractive_form (function);
362 UNGCPRO;
363 if (CONSP (form))
364 specs = filter_specs = Fcar (XCDR (form));
365 else
366 wrong_type_argument (Qcommandp, function);
367 }
ec28a64d 368
ccb5c14f 369 /* If SPECS is set to a string, use it as an interactive prompt. */
6e54b3de 370 if (STRINGP (specs))
5b71542d
DA
371 /* Make a copy of string so that if a GC relocates specs,
372 `string' will still be valid. */
373 string = xlispstrdupa (specs);
023accd6 374 else
ec28a64d 375 {
03e130d5 376 Lisp_Object input;
d032d5e7 377 Lisp_Object funval = Findirect_function (function, Qt);
3300e6fd 378 uintmax_t events = num_input_events;
03e130d5
RS
379 input = specs;
380 /* Compute the arg values using the user's expression. */
079e479f 381 GCPRO2 (input, filter_specs);
d032d5e7 382 specs = Feval (specs,
b5071fc7
SM
383 CONSP (funval) && EQ (Qclosure, XCAR (funval))
384 ? CAR_SAFE (XCDR (funval)) : Qnil);
079e479f 385 UNGCPRO;
a1759b76 386 if (events != num_input_events || !NILP (record_flag))
03e130d5
RS
387 {
388 /* We should record this command on the command history. */
f1321dc3 389 Lisp_Object values;
d65859c3 390 Lisp_Object this_cmd;
03e130d5
RS
391 /* Make a copy of the list of values, for the command history,
392 and turn them into things we can eval. */
393 values = quotify_args (Fcopy_sequence (specs));
120d0a23 394 fix_command (input, values);
d65859c3
DN
395 this_cmd = Fcons (function, values);
396 if (history_delete_duplicates)
397 Vcommand_history = Fdelete (this_cmd, Vcommand_history);
398 Vcommand_history = Fcons (this_cmd, Vcommand_history);
225c2157
RS
399
400 /* Don't keep command history around forever. */
b9f0b172 401 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
402 {
403 teml = Fnthcdr (Vhistory_length, Vcommand_history);
404 if (CONSP (teml))
f3fbd155 405 XSETCDR (teml, Qnil);
225c2157 406 }
03e130d5 407 }
0605dd79
RS
408
409 Vthis_command = save_this_command;
410 Vthis_original_command = save_this_original_command;
f2d6a3df 411 Vreal_this_command = save_real_this_command;
15dbb4d6 412 kset_last_command (current_kboard, save_last_command);
0605dd79 413
0e4857b7 414 {
2bfa3d3e 415 Lisp_Object tem0, args[3];
0e4857b7
SM
416 args[0] = Qfuncall_interactively;
417 args[1] = function;
418 args[2] = specs;
2bfa3d3e
BT
419 tem0 = Fapply (3, args);
420 dynwind_end ();
421 return tem0;
0e4857b7 422 }
ec28a64d
MB
423 }
424
f2d6a3df 425 /* Here if function specifies a string to control parsing the defaults. */
ec28a64d 426
dbc4e1c1 427 /* Set next_event to point to the first event with parameters. */
d455db8e 428 for (next_event = 0; next_event < key_count; next_event++)
1b511542 429 if (EVENT_HAS_PARAMETERS (AREF (keys, next_event)))
dbc4e1c1 430 break;
09c886dc 431
42bb2790 432 /* Handle special starting chars `*' and `@'. Also `-'. */
e92d107b 433 /* Note that `+' is reserved for user extensions. */
ec28a64d
MB
434 while (1)
435 {
fb775602 436 if (*string == '+')
e92d107b
RS
437 error ("`+' is not used in `interactive' for ordinary commands");
438 else if (*string == '*')
ec28a64d
MB
439 {
440 string++;
4b4deea2 441 if (!NILP (BVAR (current_buffer, read_only)))
09c886dc
RS
442 {
443 if (!NILP (record_flag))
444 {
a2db9982 445 char *p = string;
09c886dc
RS
446 while (*p)
447 {
448 if (! (*p == 'r' || *p == 'p' || *p == 'P'
449 || *p == '\n'))
450 Fbarf_if_buffer_read_only ();
451 p++;
452 }
453 record_then_fail = 1;
454 }
455 else
456 Fbarf_if_buffer_read_only ();
457 }
ec28a64d 458 }
42bb2790
RS
459 /* Ignore this for semi-compatibility with Lucid. */
460 else if (*string == '-')
461 string++;
ec28a64d
MB
462 else if (*string == '@')
463 {
a3e8cbda 464 Lisp_Object event, w;
dbc4e1c1 465
170d3006 466 event = (next_event < key_count
1b511542 467 ? AREF (keys, next_event)
170d3006 468 : Qnil);
dbc4e1c1 469 if (EVENT_HAS_PARAMETERS (event)
a3e8cbda
PE
470 && (w = XCDR (event), CONSP (w))
471 && (w = XCAR (w), CONSP (w))
472 && (w = XCAR (w), WINDOWP (w)))
d1fa2e8a 473 {
a3e8cbda
PE
474 if (MINI_WINDOW_P (XWINDOW (w))
475 && ! (minibuf_level > 0 && EQ (w, minibuf_window)))
d1fa2e8a 476 error ("Attempt to select inactive minibuffer window");
ef2515c0
RS
477
478 /* If the current buffer wants to clean up, let it. */
dee091a3 479 Frun_hooks (1, &Qmouse_leave_buffer_hook);
ef2515c0 480
a3e8cbda 481 Fselect_window (w, Qnil);
d1fa2e8a 482 }
ec28a64d 483 string++;
ec28a64d 484 }
9bdb1538
CY
485 else if (*string == '^')
486 {
84db11d6 487 call0 (Qhandle_shift_selection);
9bdb1538
CY
488 string++;
489 }
ec28a64d
MB
490 else break;
491 }
492
0e4857b7
SM
493 /* Count the number of arguments, which is two (the function itself and
494 `funcall-interactively') plus the number of arguments the interactive spec
495 would have us give to the function. */
ec28a64d 496 tem = string;
0e4857b7 497 for (nargs = 2; *tem; )
ec28a64d
MB
498 {
499 /* 'r' specifications ("point and mark as 2 numeric args")
500 produce *two* arguments. */
e4305426 501 if (*tem == 'r')
becfa255 502 nargs += 2;
e4305426 503 else
becfa255 504 nargs++;
a2db9982 505 tem = strchr (tem, '\n');
ec28a64d 506 if (tem)
e4305426 507 ++tem;
ec28a64d 508 else
e4305426 509 break;
ec28a64d 510 }
ec28a64d 511
f66c7cf8 512 if (min (MOST_POSITIVE_FIXNUM,
663e2b3f 513 min (PTRDIFF_MAX, SIZE_MAX) / word_size)
f66c7cf8
PE
514 < nargs)
515 memory_full (SIZE_MAX);
516
38182d90
PE
517 args = alloca (nargs * sizeof *args);
518 visargs = alloca (nargs * sizeof *visargs);
519 varies = alloca (nargs * sizeof *varies);
ec28a64d 520
becfa255 521 for (i = 0; i < nargs; i++)
ec28a64d
MB
522 {
523 args[i] = Qnil;
524 visargs[i] = Qnil;
525 varies[i] = 0;
526 }
527
39900c4e 528 GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
becfa255
PE
529 gcpro3.nvars = nargs;
530 gcpro4.nvars = nargs;
ec28a64d 531
52614803
RS
532 if (!NILP (enable))
533 specbind (Qenable_recursive_minibuffers, Qt);
534
ec28a64d 535 tem = string;
0e4857b7 536 for (i = 2; *tem; i++)
ec28a64d 537 {
0e4857b7
SM
538 visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n"));
539 if (strchr (SSDATA (visargs[1]), '%'))
319e8ddc 540 callint_message = Fformat (i - 1, visargs + 1);
55b41ef5 541 else
0e4857b7 542 callint_message = visargs[1];
ec28a64d
MB
543
544 switch (*tem)
545 {
b09cca6a 546 case 'a': /* Symbol defined as a function. */
55b41ef5 547 visargs[i] = Fcompleting_read (callint_message,
ff9cd111 548 Vobarray, Qfboundp, Qt,
93fb51ae 549 Qnil, Qnil, Qnil, Qnil);
b09cca6a 550 /* Passing args[i] directly stimulates compiler bug. */
ec28a64d
MB
551 teml = visargs[i];
552 args[i] = Fintern (teml, Qnil);
553 break;
554
b09cca6a 555 case 'b': /* Name of existing buffer. */
f03f8f2c
JL
556 args[i] = Fcurrent_buffer ();
557 if (EQ (selected_window, minibuf_window))
558 args[i] = Fother_buffer (args[i], Qnil, Qnil);
559 args[i] = Fread_buffer (callint_message, args[i], Qt);
560 break;
561
b09cca6a 562 case 'B': /* Name of buffer, possibly nonexistent. */
f03f8f2c
JL
563 args[i] = Fread_buffer (callint_message,
564 Fother_buffer (Fcurrent_buffer (), Qnil, Qnil),
565 Qnil);
ec28a64d
MB
566 break;
567
b09cca6a 568 case 'c': /* Character. */
54b33868
MR
569 /* Prompt in `minibuffer-prompt' face. */
570 Fput_text_property (make_number (0),
571 make_number (SCHARS (callint_message)),
572 Qface, Qminibuffer_prompt, callint_message);
55b41ef5 573 args[i] = Fread_char (callint_message, Qnil, Qnil);
7d652d97 574 message1_nolog (0);
b09cca6a 575 /* Passing args[i] directly stimulates compiler bug. */
ec28a64d 576 teml = args[i];
c8fd3bd0
GM
577 /* See bug#8479. */
578 if (! CHARACTERP (teml)) error ("Non-character input-event");
ec28a64d
MB
579 visargs[i] = Fchar_to_string (teml);
580 break;
581
b09cca6a 582 case 'C': /* Command: symbol with interactive function. */
55b41ef5 583 visargs[i] = Fcompleting_read (callint_message,
ff9cd111 584 Vobarray, Qcommandp,
93fb51ae 585 Qt, Qnil, Qnil, Qnil, Qnil);
b09cca6a 586 /* Passing args[i] directly stimulates compiler bug. */
ec28a64d
MB
587 teml = visargs[i];
588 args[i] = Fintern (teml, Qnil);
589 break;
590
591 case 'd': /* Value of point. Does not do I/O. */
dc330139 592 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
824977b6 593 args[i] = point_marker;
ec28a64d
MB
594 /* visargs[i] = Qnil; */
595 varies[i] = 1;
596 break;
597
b09cca6a 598 case 'D': /* Directory name. */
9dc774d4
DA
599 args[i] = read_file_name (BVAR (current_buffer, directory), Qlambda, Qnil,
600 Qfile_directory_p);
ec28a64d
MB
601 break;
602
b09cca6a 603 case 'f': /* Existing file name. */
9dc774d4 604 args[i] = read_file_name (Qnil, Qlambda, Qnil, Qnil);
ec28a64d
MB
605 break;
606
b09cca6a 607 case 'F': /* Possibly nonexistent file name. */
9dc774d4 608 args[i] = read_file_name (Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
609 break;
610
75f9fbe8 611 case 'G': /* Possibly nonexistent file name,
b09cca6a 612 default to directory alone. */
9dc774d4 613 args[i] = read_file_name (Qnil, Qnil, empty_unibyte_string, Qnil);
75f9fbe8
RS
614 break;
615
b09cca6a 616 case 'i': /* Ignore an argument -- Does not do I/O. */
40b2421c
KH
617 varies[i] = -1;
618 break;
619
b09cca6a 620 case 'k': /* Key sequence. */
c631c234 621 {
2bfa3d3e 622 dynwind_begin ();
c631c234 623 specbind (Qcursor_in_echo_area, Qt);
54b33868
MR
624 /* Prompt in `minibuffer-prompt' face. */
625 Fput_text_property (make_number (0),
626 make_number (SCHARS (callint_message)),
627 Qface, Qminibuffer_prompt, callint_message);
55b41ef5 628 args[i] = Fread_key_sequence (callint_message,
ad4ac475 629 Qnil, Qnil, Qnil, Qnil);
2bfa3d3e 630 dynwind_end ();
c631c234 631 teml = args[i];
a1bfe073 632 visargs[i] = Fkey_description (teml, Qnil);
cdfac812
RS
633
634 /* If the key sequence ends with a down-event,
635 discard the following up-event. */
636 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
637 if (CONSP (teml))
70949dac 638 teml = XCAR (teml);
cdfac812
RS
639 if (SYMBOLP (teml))
640 {
641 Lisp_Object tem2;
642
643 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
644 /* Ignore first element, which is the base key. */
645 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 646 if (! NILP (tem2))
43811b4e 647 up_event = Fread_event (Qnil, Qnil, Qnil);
cdfac812 648 }
c631c234 649 }
1989e7bc
RS
650 break;
651
b09cca6a 652 case 'K': /* Key sequence to be defined. */
c631c234 653 {
2bfa3d3e 654 dynwind_begin ();
c631c234 655 specbind (Qcursor_in_echo_area, Qt);
54b33868
MR
656 /* Prompt in `minibuffer-prompt' face. */
657 Fput_text_property (make_number (0),
658 make_number (SCHARS (callint_message)),
659 Qface, Qminibuffer_prompt, callint_message);
d99760fa
SM
660 args[i] = Fread_key_sequence_vector (callint_message,
661 Qnil, Qt, Qnil, Qnil);
c631c234 662 teml = args[i];
a1bfe073 663 visargs[i] = Fkey_description (teml, Qnil);
2bfa3d3e 664 dynwind_end ();
cdfac812
RS
665
666 /* If the key sequence ends with a down-event,
667 discard the following up-event. */
668 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
669 if (CONSP (teml))
70949dac 670 teml = XCAR (teml);
cdfac812
RS
671 if (SYMBOLP (teml))
672 {
673 Lisp_Object tem2;
674
675 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
676 /* Ignore first element, which is the base key. */
677 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 678 if (! NILP (tem2))
43811b4e 679 up_event = Fread_event (Qnil, Qnil, Qnil);
cdfac812 680 }
c631c234 681 }
ec28a64d
MB
682 break;
683
b09cca6a 684 case 'U': /* Up event from last k or K. */
39900c4e
KS
685 if (!NILP (up_event))
686 {
687 args[i] = Fmake_vector (make_number (1), up_event);
688 up_event = Qnil;
689 teml = args[i];
690 visargs[i] = Fkey_description (teml, Qnil);
691 }
692 break;
693
bc78232c 694 case 'e': /* The invoking event. */
d455db8e 695 if (next_event >= key_count)
bc78232c 696 error ("%s must be bound to an event with parameters",
6e54b3de 697 (SYMBOLP (function)
51b59d79 698 ? SSDATA (SYMBOL_NAME (function))
bc78232c 699 : "command"));
1b511542
SM
700 args[i] = AREF (keys, next_event);
701 next_event++;
e5d77022 702 varies[i] = -1;
dbc4e1c1
JB
703
704 /* Find the next parameterized event. */
d455db8e 705 while (next_event < key_count
1b511542 706 && !(EVENT_HAS_PARAMETERS (AREF (keys, next_event))))
dbc4e1c1
JB
707 next_event++;
708
63007de2
JB
709 break;
710
ec28a64d 711 case 'm': /* Value of mark. Does not do I/O. */
f203cf07 712 check_mark (0);
ec28a64d 713 /* visargs[i] = Qnil; */
4b4deea2 714 args[i] = BVAR (current_buffer, mark);
ec28a64d
MB
715 varies[i] = 2;
716 break;
717
93fb51ae
KH
718 case 'M': /* String read via minibuffer with
719 inheriting the current input method. */
55b41ef5 720 args[i] = Fread_string (callint_message,
93fb51ae
KH
721 Qnil, Qnil, Qnil, Qt);
722 break;
723
b09cca6a 724 case 'N': /* Prefix arg as number, else number from minibuffer. */
265a9e55 725 if (!NILP (prefix_arg))
ec28a64d
MB
726 goto have_prefix_arg;
727 case 'n': /* Read number from minibuffer. */
0208ede7 728 args[i] = call1 (Qread_number, callint_message);
a261c53e
JL
729 /* Passing args[i] directly stimulates compiler bug. */
730 teml = args[i];
731 visargs[i] = Fnumber_to_string (teml);
ec28a64d
MB
732 break;
733
734 case 'P': /* Prefix arg in raw form. Does no I/O. */
ec28a64d
MB
735 args[i] = prefix_arg;
736 /* visargs[i] = Qnil; */
737 varies[i] = -1;
738 break;
739
b09cca6a 740 case 'p': /* Prefix arg converted to number. No I/O. */
71eda2d5 741 have_prefix_arg:
ec28a64d
MB
742 args[i] = Fprefix_numeric_value (prefix_arg);
743 /* visargs[i] = Qnil; */
744 varies[i] = -1;
745 break;
746
b09cca6a 747 case 'r': /* Region, point and mark as 2 args. */
f203cf07 748 check_mark (1);
dc330139 749 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
ec28a64d 750 /* visargs[i+1] = Qnil; */
2f221583 751 mark = marker_position (BVAR (current_buffer, mark));
ec28a64d 752 /* visargs[i] = Qnil; */
2f221583 753 args[i] = PT < mark ? point_marker : BVAR (current_buffer, mark);
ec28a64d 754 varies[i] = 3;
2f221583 755 args[++i] = PT > mark ? point_marker : BVAR (current_buffer, mark);
ec28a64d
MB
756 varies[i] = 4;
757 break;
758
93fb51ae
KH
759 case 's': /* String read via minibuffer without
760 inheriting the current input method. */
55b41ef5 761 args[i] = Fread_string (callint_message,
93fb51ae 762 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
763 break;
764
765 case 'S': /* Any symbol. */
55b41ef5 766 visargs[i] = Fread_string (callint_message,
93fb51ae 767 Qnil, Qnil, Qnil, Qnil);
b09cca6a 768 /* Passing args[i] directly stimulates compiler bug. */
ec28a64d
MB
769 teml = visargs[i];
770 args[i] = Fintern (teml, Qnil);
771 break;
772
773 case 'v': /* Variable name: symbol that is
b09cca6a 774 custom-variable-p. */
55b41ef5 775 args[i] = Fread_variable (callint_message, Qnil);
ec28a64d
MB
776 visargs[i] = last_minibuf_string;
777 break;
778
b09cca6a 779 case 'x': /* Lisp expression read but not evaluated. */
30c7e542 780 args[i] = call1 (intern ("read-minibuffer"), callint_message);
ec28a64d
MB
781 visargs[i] = last_minibuf_string;
782 break;
783
b09cca6a 784 case 'X': /* Lisp expression read and evaluated. */
30c7e542 785 args[i] = call1 (intern ("eval-minibuffer"), callint_message);
ec28a64d
MB
786 visargs[i] = last_minibuf_string;
787 break;
788
40b2421c 789 case 'Z': /* Coding-system symbol, or ignore the
b09cca6a 790 argument if no prefix. */
40b2421c
KH
791 if (NILP (prefix_arg))
792 {
793 args[i] = Qnil;
794 varies[i] = -1;
795 }
177c0ea7 796 else
40b2421c
KH
797 {
798 args[i]
55b41ef5 799 = Fread_non_nil_coding_system (callint_message);
40b2421c
KH
800 visargs[i] = last_minibuf_string;
801 }
802 break;
803
b09cca6a 804 case 'z': /* Coding-system symbol or nil. */
55b41ef5 805 args[i] = Fread_coding_system (callint_message, Qnil);
40b2421c
KH
806 visargs[i] = last_minibuf_string;
807 break;
808
e92d107b
RS
809 /* We have a case for `+' so we get an error
810 if anyone tries to define one here. */
811 case '+':
ec28a64d 812 default:
e6c3da20
EZ
813 error ("Invalid control letter `%c' (#o%03o, #x%04x) in interactive calling string",
814 STRING_CHAR ((unsigned char *) tem),
815 (unsigned) STRING_CHAR ((unsigned char *) tem),
816 (unsigned) STRING_CHAR ((unsigned char *) tem));
ec28a64d
MB
817 }
818
819 if (varies[i] == 0)
820 arg_from_tty = 1;
821
6e54b3de 822 if (NILP (visargs[i]) && STRINGP (args[i]))
ec28a64d
MB
823 visargs[i] = args[i];
824
a2db9982 825 tem = strchr (tem, '\n');
ec28a64d 826 if (tem) tem++;
a2db9982 827 else tem = "";
ec28a64d 828 }
2bfa3d3e 829 dynwind_end ();
ec28a64d
MB
830
831 QUIT;
832
0e4857b7
SM
833 args[0] = Qfuncall_interactively;
834 args[1] = function;
ec28a64d 835
7868a977 836 if (arg_from_tty || !NILP (record_flag))
ec28a64d 837 {
07ff4ac6
SM
838 /* We don't need `visargs' any more, so let's recycle it since we need
839 an array of just the same size. */
0e4857b7
SM
840 visargs[1] = function;
841 for (i = 2; i < nargs; i++)
824977b6
RS
842 {
843 if (varies[i] > 0)
6c6f1994 844 visargs[i] = list1 (intern (callint_argfuns[varies[i]]));
824977b6
RS
845 else
846 visargs[i] = quotify_arg (args[i]);
847 }
0e4857b7 848 Vcommand_history = Fcons (Flist (nargs - 1, visargs + 1),
ec28a64d 849 Vcommand_history);
225c2157 850 /* Don't keep command history around forever. */
b9f0b172 851 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
852 {
853 teml = Fnthcdr (Vhistory_length, Vcommand_history);
854 if (CONSP (teml))
f3fbd155 855 XSETCDR (teml, Qnil);
225c2157 856 }
ec28a64d
MB
857 }
858
824977b6
RS
859 /* If we used a marker to hold point, mark, or an end of the region,
860 temporarily, convert it to an integer now. */
0e4857b7 861 for (i = 2; i < nargs; i++)
824977b6
RS
862 if (varies[i] >= 1 && varies[i] <= 4)
863 XSETINT (args[i], marker_position (args[i]));
864
09c886dc
RS
865 if (record_then_fail)
866 Fbarf_if_buffer_read_only ();
867
0605dd79
RS
868 Vthis_command = save_this_command;
869 Vthis_original_command = save_this_original_command;
f2d6a3df 870 Vreal_this_command = save_real_this_command;
15dbb4d6 871 kset_last_command (current_kboard, save_last_command);
0605dd79 872
ec28a64d 873 {
0e4857b7 874 Lisp_Object val = Ffuncall (nargs, args);
ec28a64d 875 UNGCPRO;
2bfa3d3e
BT
876 dynwind_end ();
877 return val;
ec28a64d 878 }
177c0ea7 879}
ec28a64d 880
a7ca3326 881DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
fdb82f93
PJ
882 1, 1, 0,
883 doc: /* Return numeric meaning of raw prefix argument RAW.
884A raw prefix argument is what you get from `(interactive "P")'.
885Its numeric meaning is what you would get from `(interactive "p")'. */)
5842a27b 886 (Lisp_Object raw)
ec28a64d
MB
887{
888 Lisp_Object val;
177c0ea7 889
265a9e55 890 if (NILP (raw))
acab6442 891 XSETFASTINT (val, 1);
fd5285f3 892 else if (EQ (raw, Qminus))
ec28a64d 893 XSETINT (val, -1);
70949dac
KR
894 else if (CONSP (raw) && INTEGERP (XCAR (raw)))
895 XSETINT (val, XINT (XCAR (raw)));
6e54b3de 896 else if (INTEGERP (raw))
ec28a64d
MB
897 val = raw;
898 else
acab6442 899 XSETFASTINT (val, 1);
ec28a64d
MB
900
901 return val;
902}
903
dfcf069d 904void
971de7fb 905syms_of_callint (void)
ec28a64d 906{
fe6aa7a1
BT
907#include "callint.x"
908
824977b6
RS
909 point_marker = Fmake_marker ();
910 staticpro (&point_marker);
911
55b41ef5
CY
912 callint_message = Qnil;
913 staticpro (&callint_message);
914
3438fe21 915 preserved_fns = listn (CONSTYPE_PURE, 4,
694b6c97
DA
916 intern_c_string ("region-beginning"),
917 intern_c_string ("region-end"),
918 intern_c_string ("point"),
919 intern_c_string ("mark"));
03e130d5 920
cd3520a4
JB
921 DEFSYM (Qlist, "list");
922 DEFSYM (Qlet, "let");
923 DEFSYM (Qif, "if");
924 DEFSYM (Qwhen, "when");
925 DEFSYM (Qletx, "let*");
926 DEFSYM (Qsave_excursion, "save-excursion");
927 DEFSYM (Qprogn, "progn");
928 DEFSYM (Qminus, "-");
929 DEFSYM (Qplus, "+");
930 DEFSYM (Qhandle_shift_selection, "handle-shift-selection");
0208ede7 931 DEFSYM (Qread_number, "read-number");
0e4857b7 932 DEFSYM (Qfuncall_interactively, "funcall-interactively");
cd3520a4
JB
933 DEFSYM (Qcommand_debug_status, "command-debug-status");
934 DEFSYM (Qenable_recursive_minibuffers, "enable-recursive-minibuffers");
935 DEFSYM (Qmouse_leave_buffer_hook, "mouse-leave-buffer-hook");
ef2515c0 936
1e0c5826 937 DEFVAR_KBOARD ("prefix-arg", Vprefix_arg,
fdb82f93
PJ
938 doc: /* The value of the prefix argument for the next editing command.
939It may be a number, or the symbol `-' for just a minus sign as arg,
940or a list whose car is a number for just one or more C-u's
941or nil if no argument has been specified.
942
943You cannot examine this variable to find the argument for this command
944since it has been set to nil by the time you can look.
945Instead, you should use the variable `current-prefix-arg', although
946normally commands can get this prefix argument with (interactive "P"). */);
8c917bf2 947
fe3fbdcc 948 DEFVAR_KBOARD ("last-prefix-arg", Vlast_prefix_arg,
fdb82f93
PJ
949 doc: /* The value of the prefix argument for the previous editing command.
950See `prefix-arg' for the meaning of the value. */);
fe3fbdcc 951
29208e82 952 DEFVAR_LISP ("current-prefix-arg", Vcurrent_prefix_arg,
fdb82f93
PJ
953 doc: /* The value of the prefix argument for this editing command.
954It may be a number, or the symbol `-' for just a minus sign as arg,
955or a list whose car is a number for just one or more C-u's
956or nil if no argument has been specified.
957This is what `(interactive \"P\")' returns. */);
8c917bf2
KH
958 Vcurrent_prefix_arg = Qnil;
959
29208e82 960 DEFVAR_LISP ("command-history", Vcommand_history,
fdb82f93 961 doc: /* List of recent commands that read arguments from terminal.
b014713c
EZ
962Each command is represented as a form to evaluate.
963
964Maximum length of the history list is determined by the value
965of `history-length', which see. */);
ec28a64d
MB
966 Vcommand_history = Qnil;
967
29208e82 968 DEFVAR_LISP ("command-debug-status", Vcommand_debug_status,
fdb82f93
PJ
969 doc: /* Debugging status of current interactive command.
970Bound each time `call-interactively' is called;
971may be set by the debugger as a reminder for itself. */);
ec28a64d
MB
972 Vcommand_debug_status = Qnil;
973
29208e82 974 DEFVAR_LISP ("mark-even-if-inactive", Vmark_even_if_inactive,
fb7ada5f 975 doc: /* Non-nil means you can use the mark even when inactive.
fdb82f93
PJ
976This option makes a difference in Transient Mark mode.
977When the option is non-nil, deactivation of the mark
978turns off region highlighting, but commands that use the mark
979behave as if the mark were still active. */);
a2b84f35 980 Vmark_even_if_inactive = Qt;
9f315aeb 981
29208e82 982 DEFVAR_LISP ("mouse-leave-buffer-hook", Vmouse_leave_buffer_hook,
fdb82f93
PJ
983 doc: /* Hook to run when about to switch windows with a mouse command.
984Its purpose is to give temporary modes such as Isearch mode
985a way to turn themselves off when a mouse command switches windows. */);
ef2515c0 986 Vmouse_leave_buffer_hook = Qnil;
ec28a64d 987}