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