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