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