1 /* Call a Lisp function interactively.
2 Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc.
3 Copyright (C) 1995, 1996 Ben Wing.
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; 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. */
22 /* Synched up with: FSF 19.30, Mule 2.0. */
27 Mly or JWZ: various changes.
40 extern Charcount num_input_chars;
42 Lisp_Object Vcurrent_prefix_arg;
43 Lisp_Object Qcall_interactively;
44 Lisp_Object Vcommand_history;
46 Lisp_Object Vcommand_debug_status, Qcommand_debug_status;
47 Lisp_Object Qenable_recursive_minibuffers;
50 /* Non-nil means treat the mark as active
51 even if mark_active is 0. */
52 Lisp_Object Vmark_even_if_inactive;
55 #if 0 /* ill-conceived */
56 /* FSF calls Qmouse_leave_buffer_hook at all sorts of random places,
57 including a bunch of places in their mouse.el. If this is
58 implemented, it has to be done cleanly. */
59 Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
62 Lisp_Object QletX, Qsave_excursion;
64 Lisp_Object Qread_from_minibuffer;
65 Lisp_Object Qread_file_name;
66 Lisp_Object Qread_directory_name;
67 Lisp_Object Qcompleting_read;
68 Lisp_Object Qread_buffer;
69 Lisp_Object Qread_function;
70 Lisp_Object Qread_variable;
71 Lisp_Object Qread_expression;
72 Lisp_Object Qread_command;
73 Lisp_Object Qread_number;
74 Lisp_Object Qread_string;
75 Lisp_Object Qevents_to_keys;
77 #if defined(MULE) || defined(FILE_CODING)
78 Lisp_Object Qread_coding_system;
79 Lisp_Object Qread_non_nil_coding_system;
83 DEFUN ("interactive", Finteractive, 0, UNEVALLED, 0, /*
84 Specify a way of parsing arguments for interactive use of a function.
86 (defun foo (arg) "Doc string" (interactive "p") ...use arg...)
87 to make ARG be the prefix argument when `foo' is called as a command.
88 The "call" to `interactive' is actually a declaration rather than a function;
89 it tells `call-interactively' how to read arguments
90 to pass to the function.
91 When actually called, `interactive' just returns nil.
93 The argument of `interactive' is usually a string containing a code letter
94 followed by a prompt. (Some code letters do not use I/O to get
95 the argument and do not need prompts.) To prompt for multiple arguments,
96 give a code letter, its prompt, a newline, and another code letter, etc.
97 Prompts are passed to format, and may use % escapes to print the
98 arguments that have already been read.
99 If the argument is not a string, it is evaluated to get a list of
100 arguments to pass to the function.
101 Just `(interactive)' means pass no args when calling interactively.
103 Code letters available are:
104 a -- Function name: symbol with a function definition.
105 b -- Name of existing buffer.
106 B -- Name of buffer, possibly nonexistent.
108 C -- Command name: symbol with interactive function definition.
109 d -- Value of point as number. Does not do I/O.
111 e -- Last mouse-button or misc-user event that invoked this command.
112 If used more than once, the Nth `e' returns the Nth such event.
114 f -- Existing file name.
115 F -- Possibly nonexistent file name.
116 i -- Always nil, ignore. Use to skip arguments when interactive.
117 k -- Key sequence (a vector of events).
118 K -- Key sequence to be redefined (do not automatically down-case).
119 m -- Value of mark as number. Does not do I/O.
120 n -- Number read using minibuffer.
121 N -- Prefix arg converted to number, or if none, do like code `n'.
122 p -- Prefix arg converted to number. Does not do I/O.
123 P -- Prefix arg in raw form. Does not do I/O.
124 r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.
127 v -- Variable name: symbol that is user-variable-p.
128 x -- Lisp expression read but not evaluated.
129 X -- Lisp expression read and evaluated.
130 z -- Coding system. (Always nil if no Mule support.)
131 Z -- Coding system, nil if no prefix arg. (Always nil if no Mule support.)
132 In addition, if the string begins with `*'
133 then an error is signaled if the buffer is read-only.
134 This happens before reading any arguments.
135 If the string begins with `@', then the window the mouse is over is selected
136 before anything else is done.
137 If the string begins with `_', then this command will not cause the region
138 to be deactivated when it completes; that is, `zmacs-region-stays' will be
139 set to t when the command exits successfully.
140 You may use any of `@', `*' and `_' at the beginning of the string;
141 they are processed in the order that they appear.
148 /* Originally, this was just a function -- but `custom' used a
149 garden-variety version, so why not make it a subr? */
150 /* #### Move it to another file! */
151 DEFUN ("quote-maybe", Fquote_maybe, 1, 1, 0, /*
152 Quote EXPR if it is not self quoting.
164 || BIT_VECTORP (expr)
165 || (CONSP (expr) && EQ (XCAR (expr), Qlambda)))
166 ? expr : list2 (Qquote, expr));
169 /* Modify EXPR by quotifying each element (except the first). */
171 quotify_args (Lisp_Object expr)
175 for (tail = expr; CONSP (tail); tail = ptr->cdr)
178 ptr->car = Fquote_maybe (ptr->car);
188 if (zmacs_regions && !zmacs_region_active_p)
189 error ("The region is not active now");
191 tem = Fmarker_buffer (current_buffer->mark);
192 if (NILP (tem) || (XBUFFER (tem) != current_buffer))
193 error ("The mark is not set now");
195 return marker_position (current_buffer->mark);
199 callint_prompt (const Bufbyte *prompt_start, Bytecount prompt_length,
200 const Lisp_Object *args, int nargs)
202 Lisp_Object s = make_string (prompt_start, prompt_length);
205 /* Fformat no longer smashes its arg vector, so no need to copy it. */
207 if (!strchr ((char *) XSTRING_DATA (s), '%'))
210 RETURN_UNGCPRO (emacs_doprnt_string_lisp (0, s, 0, nargs, args));
213 /* `lambda' for RECORD-FLAG is an XEmacs addition. */
215 DEFUN ("call-interactively", Fcall_interactively, 1, 3, 0, /*
216 Call FUNCTION, reading args according to its interactive calling specs.
217 Return the value FUNCTION returns.
218 The function contains a specification of how to do the argument reading.
219 In the case of user-defined functions, this is specified by placing a call
220 to the function `interactive' at the top level of the function body.
223 If optional second arg RECORD-FLAG is the symbol `lambda', the interactive
224 calling arguments for FUNCTION are read and returned as a list,
225 but the function is not called on them.
227 If RECORD-FLAG is `t' then unconditionally put this command in the
228 command-history. Otherwise, this is done only if an arg is read using
231 The argument KEYS specifies the value to use instead of (this-command-keys)
232 when reading the arguments.
234 (function, record_flag, keys))
236 /* This function can GC */
237 int speccount = specpdl_depth ();
241 Lisp_Object specs = Qnil;
242 #ifdef IT_SEEMS_THAT_MLY_DOESNT_LIKE_THIS
245 /* If SPECS is a string, we reset prompt_data to string_data
246 * (XSTRING (specs)) every time a GC might have occurred */
247 const char *prompt_data = 0;
248 int prompt_index = 0;
250 int set_zmacs_region_stays = 0;
251 int mouse_event_count = 0;
258 len = XVECTOR_LENGTH (keys);
259 for (i = 0; i < len; i++)
260 CHECK_LIVE_EVENT (XVECTOR_DATA (keys)[i]);
263 /* Save this now, since use of minibuffer will clobber it. */
264 prefix = Vcurrent_prefix_arg;
268 #ifdef IT_SEEMS_THAT_MLY_DOESNT_LIKE_THIS
269 /* Marginal kludge. Use an evaluated interactive spec instead of this! */
270 if (SYMBOLP (function))
271 enable = Fget (function, Qenable_recursive_minibuffers, Qnil);
274 fun = indirect_function (function, 1);
276 /* Decode the kind of function. Either handle it and return,
277 or go to `lose' if not interactive, or go to `retry'
278 to specify a different function, or set either PROMPT_DATA or SPECS. */
282 prompt_data = XSUBR (fun)->prompt;
286 function = wrong_type_argument (Qcommandp, function);
289 #if 0 /* FSFmacs */ /* Huh? Where is this used? */
290 if ((EMACS_INT) prompt_data == 1)
291 /* Let SPECS (which is nil) be used as the args. */
295 else if (COMPILED_FUNCTIONP (fun))
297 Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (fun);
298 if (! f->flags.interactivep)
300 specs = compiled_function_interactive (f);
302 else if (!CONSP (fun))
306 Lisp_Object funcar = Fcar (fun);
308 if (EQ (funcar, Qautoload))
312 /* do_autoload GCPROs both arguments */
313 do_autoload (fun, function);
317 else if (EQ (funcar, Qlambda))
319 specs = Fassq (Qinteractive, Fcdr (Fcdr (fun)));
322 specs = Fcar (Fcdr (specs));
328 /* FSFmacs makes an alloca() copy of prompt_data here.
329 We're more intelligent about this and just reset prompt_data
331 /* If either specs or prompt_data is set to a string, use it. */
332 if (!STRINGP (specs) && prompt_data == 0)
334 struct gcpro gcpro1, gcpro2, gcpro3;
335 int i = num_input_chars;
336 Lisp_Object input = specs;
338 GCPRO3 (function, specs, input);
339 /* Compute the arg values using the user's expression. */
340 specs = Feval (specs);
341 if (EQ (record_flag, Qlambda)) /* XEmacs addition */
346 if (!NILP (record_flag) || i != num_input_chars)
348 /* We should record this command on the command history. */
349 /* #### The following is too specific; should have general
350 mechanism for doing this. */
351 Lisp_Object values, car;
352 /* Make a copy of the list of values, for the command history,
353 and turn them into things we can eval. */
354 values = quotify_args (Fcopy_sequence (specs));
355 /* If the list of args was produced with an explicit call to `list',
356 look for elements that were computed with (region-beginning)
357 or (region-end), and put those expressions into VALUES
358 instead of the present values. */
362 /* Skip through certain special forms. */
363 while (EQ (car, Qlet) || EQ (car, QletX)
364 || EQ (car, Qsave_excursion))
366 while (CONSP (XCDR (input)))
367 input = XCDR (input);
368 input = XCAR (input);
375 Lisp_Object intail, valtail;
376 for (intail = Fcdr (input), valtail = values;
378 intail = Fcdr (intail), valtail = Fcdr (valtail))
384 Lisp_Object eltcar = Fcar (elt);
385 if (EQ (eltcar, Qpoint) ||
386 EQ (eltcar, Qmark) ||
387 EQ (eltcar, Qregion_beginning) ||
388 EQ (eltcar, Qregion_end))
389 Fsetcar (valtail, Fcar (intail));
395 = Fcons (Fcons (function, values), Vcommand_history);
397 single_console_state ();
398 RETURN_UNGCPRO (apply1 (fun, specs));
401 /* Here if function specifies a string to control parsing the defaults */
404 /* Translate interactive prompt. */
407 Lisp_Object domain = Qnil;
408 if (COMPILED_FUNCTIONP (fun))
409 domain = compiled_function_domain (XCOMPILED_FUNCTION (fun));
411 specs = Fgettext (specs);
413 specs = Fdgettext (domain, specs);
415 else if (prompt_data)
416 /* We do not have to worry about domains in this case because
417 prompt_data is non-nil only for built-in functions, which
418 always use the default domain. */
419 prompt_data = gettext (prompt_data);
422 /* Handle special starting chars `*' and `@' and `_'. */
423 /* Note that `+' is reserved for user extensions. */
426 struct gcpro gcpro1, gcpro2;
427 GCPRO2 (function, specs);
432 prompt_data = (const char *) XSTRING_DATA (specs);
434 if (prompt_data[prompt_index] == '+')
435 error ("`+' is not used in `interactive' for ordinary commands");
436 else if (prompt_data[prompt_index] == '*')
439 if (!NILP (current_buffer->read_only))
440 barf_if_buffer_read_only (current_buffer, -1, -1);
442 else if (prompt_data[prompt_index] == '@')
448 event = extract_vector_nth_mouse_event (keys, 0);
451 event = extract_this_command_keys_nth_mouse_event (0);
453 /* Doesn't work; see below */
454 event = Vcurrent_mouse_event;
458 Lisp_Object window = Fevent_window (event);
461 if (MINI_WINDOW_P (XWINDOW (window))
462 && ! (minibuf_level > 0 && EQ (window,
464 error ("Attempt to select inactive minibuffer window");
466 #if 0 /* unclean! see event-stream.c */
467 /* If the current buffer wants to clean up, let it. */
468 if (!NILP (Vmouse_leave_buffer_hook))
469 run_hook (Qmouse_leave_buffer_hook);
472 Fselect_window (window, Qnil);
476 else if (prompt_data[prompt_index] == '_')
479 set_zmacs_region_stays = 1;
489 /* Count the number of arguments the interactive spec would have
490 us give to the function. */
494 for (tem = prompt_data + prompt_index; *tem; )
496 /* 'r' specifications ("point and mark as 2 numeric args")
497 produce *two* arguments. */
502 tem = (const char *) strchr (tem + 1, '\n');
509 #ifdef IT_SEEMS_THAT_MLY_DOESNT_LIKE_THIS
511 specbind (Qenable_recursive_minibuffers, Qt);
516 /* Interactive function or no arguments; just call it */
517 if (EQ (record_flag, Qlambda))
519 if (!NILP (record_flag))
521 Vcommand_history = Fcons (list1 (function), Vcommand_history);
523 specbind (Qcommand_debug_status, Qnil);
524 /* XEmacs: was fun = call0 (fun), but that's backtraced wrong */
529 fun = Ffuncall (1, &fun);
532 if (set_zmacs_region_stays)
533 zmacs_region_stays = 1;
534 return unbind_to (speccount, fun);
537 /* Read interactive arguments */
539 /* args[-1] is the function to call */
540 /* args[n] is the n'th argument to the function */
541 int alloca_size = (1 /* function to call */
542 + argcount /* actual arguments */
543 + argcount /* visargs */
544 + argcount /* varies */
546 Lisp_Object *args = alloca_array (Lisp_Object, alloca_size) + 1;
547 /* visargs is an array of either Qnil or user-friendlier versions (often
548 * strings) of previous arguments, to use in prompts for successive
549 * arguments. ("Often strings" because emacs didn't used to have
550 * format %S and prin1-to-string.) */
551 Lisp_Object *visargs = args + argcount;
552 /* If varies[i] is non-null, the i'th argument shouldn't just have
553 its value in this call quoted in the command history. It should be
554 recorded as a call to the function named varies[i]]. */
555 Lisp_Object *varies = visargs + argcount;
556 int arg_from_tty = 0;
558 struct gcpro gcpro1, gcpro2;
561 for (argnum = 0; argnum < alloca_size - 1; argnum++)
564 /* Must GC-protect args[-1] (ie function) because Ffuncall doesn't */
565 /* `function' itself isn't GC-protected -- use args[-1] from here
566 (actually, doesn't matter since Emacs GC doesn't relocate, sigh) */
567 GCPRO2 (prefix, args[-1]);
568 gcpro2.nvars = alloca_size;
570 for (argnum = 0; ; argnum++)
572 const char *prompt_start = prompt_data + prompt_index + 1;
573 const char *prompt_limit = (const char *) strchr (prompt_start, '\n');
575 prompt_length = ((prompt_limit)
576 ? (prompt_limit - prompt_start)
577 : (int) strlen (prompt_start));
578 if (prompt_limit && prompt_limit[1] == 0)
580 prompt_limit = 0; /* "sfoo:\n" -- strip tailing return */
583 /* This uses `visargs' instead of `args' so that global-set-key
584 prompts with "Set key C-x C-f to command: "instead of printing
585 event objects in there.
587 #define PROMPT() callint_prompt ((const Bufbyte *) prompt_start, prompt_length, visargs, argnum)
588 switch (prompt_data[prompt_index])
590 case 'a': /* Symbol defined as a function */
592 Lisp_Object tem = call1 (Qread_function, PROMPT ());
597 case 'b': /* Name of existing buffer */
599 Lisp_Object def = Fcurrent_buffer ();
600 if (EQ (Fselected_window (Qnil), minibuf_window))
601 def = Fother_buffer (def, Qnil, Qnil);
602 /* read-buffer returns a buffer name, not a buffer! */
603 args[argnum] = call3 (Qread_buffer, PROMPT (), def,
608 case 'B': /* Name of buffer, possibly nonexistent */
610 /* read-buffer returns a buffer name, not a buffer! */
611 args[argnum] = call2 (Qread_buffer, PROMPT (),
612 Fother_buffer (Fcurrent_buffer (), Qnil,
617 case 'c': /* Character */
620 int shadowing_speccount = specpdl_depth ();
622 specbind (Qcursor_in_echo_area, Qt);
623 message ("%s", XSTRING_DATA (PROMPT ()));
624 tem = (call0 (Qread_char));
626 /* visargs[argnum] = Fsingle_key_description (tem); */
627 /* FSF has visargs[argnum] = Fchar_to_string (tem); */
629 unbind_to (shadowing_speccount, Qnil);
631 /* #### `C-x / a' should not leave the prompt in the minibuffer.
632 This isn't the right fix, because (message ...) (read-char)
633 shouldn't leave the message there either... */
639 case 'C': /* Command: symbol with interactive function */
641 Lisp_Object tem = call1 (Qread_command, PROMPT ());
646 case 'd': /* Value of point. Does not do I/O. */
648 args[argnum] = Fcopy_marker (current_buffer->point_marker, Qt);
649 varies[argnum] = Qpoint;
657 event = extract_vector_nth_mouse_event (keys,
661 /* This doesn't quite work because this-command-keys
662 behaves in utterly counterintuitive ways. Sometimes
663 it retrieves an event back in the future, e.g. when
664 one command invokes another command and both are
665 invoked with the mouse. */
666 event = (extract_this_command_keys_nth_mouse_event
667 (mouse_event_count));
669 event = Vcurrent_mouse_event;
673 error ("%s must be bound to a mouse or misc-user event",
675 ? (char *) string_data (XSYMBOL (function)->name)
677 args[argnum] = event;
681 case 'D': /* Directory name. */
683 args[argnum] = call4 (Qread_directory_name, PROMPT (),
685 current_buffer->directory, /* default */
691 case 'f': /* Existing file name. */
693 Lisp_Object tem = call4 (Qread_file_name, PROMPT (),
696 Qzero /* must-match */
702 case 'F': /* Possibly nonexistent file name. */
704 args[argnum] = call4 (Qread_file_name, PROMPT (),
707 Qnil /* must-match */
712 case 'i': /* Ignore: always nil. Use to skip arguments. */
717 case 'k': /* Key sequence (vector of events) */
719 struct gcpro ngcpro1;
721 Lisp_Object key_prompt = PROMPT ();
724 tem = Fread_key_sequence (key_prompt, Qnil, Qnil);
727 visargs[argnum] = Fkey_description (tem);
728 /* The following makes `describe-key' not work with
729 extent-local keymaps and such; and anyway, it's
730 contrary to the documentation. */
731 /* args[argnum] = call1 (Qevents_to_keys, tem); */
736 case 'K': /* Key sequence (vector of events),
737 no automatic downcasing */
739 struct gcpro ngcpro1;
741 Lisp_Object key_prompt = PROMPT ();
744 tem = Fread_key_sequence (key_prompt, Qnil, Qt);
747 visargs[argnum] = Fkey_description (tem);
748 /* The following makes `describe-key' not work with
749 extent-local keymaps and such; and anyway, it's
750 contrary to the documentation. */
751 /* args[argnum] = call1 (Qevents_to_keys, tem); */
757 case 'm': /* Value of mark. Does not do I/O. */
759 args[argnum] = current_buffer->mark;
760 varies[argnum] = Qmark;
763 case 'n': /* Read number from minibuffer. */
766 args[argnum] = call2 (Qread_number, PROMPT (), Qnil);
767 /* numbers are too boring to go on command history */
768 /* arg_from_tty = 1; */
771 case 'N': /* Prefix arg, else number from minibuffer */
778 case 'P': /* Prefix arg in raw form. Does no I/O. */
780 args[argnum] = prefix;
783 case 'p': /* Prefix arg converted to number. No I/O. */
787 Lisp_Object tem = Fprefix_numeric_value (prefix);
792 case 'r': /* Region, point and mark as 2 args. */
794 Bufpos tem = check_mark ();
795 args[argnum] = (BUF_PT (current_buffer) < tem
796 ? Fcopy_marker (current_buffer->point_marker, Qt)
797 : current_buffer->mark);
798 varies[argnum] = Qregion_beginning;
799 args[++argnum] = (BUF_PT (current_buffer) > tem
800 ? Fcopy_marker (current_buffer->point_marker,
802 : current_buffer->mark);
803 varies[argnum] = Qregion_end;
806 case 's': /* String read via minibuffer. */
808 args[argnum] = call1 (Qread_string, PROMPT ());
812 case 'S': /* Any symbol. */
814 visargs[argnum] = Qnil;
817 Lisp_Object tem = call5 (Qcompleting_read,
822 /* nil, or prev attempt */
824 visargs[argnum] = tem;
825 /* I could use condition-case with this loser, but why bother?
826 * tem = Fread (tem); check-symbol-p;
828 tem = Fintern (tem, Qnil);
830 if (string_length (XSYMBOL (tem)->name) > 0)
831 /* Don't accept the empty-named symbol. If the loser
832 really wants this s/he can call completing-read
839 case 'v': /* Variable name: user-variable-p symbol */
841 Lisp_Object tem = call1 (Qread_variable, PROMPT ());
846 case 'x': /* Lisp expression read but not evaluated */
848 args[argnum] = call1 (Qread_expression, PROMPT ());
849 /* visargs[argnum] = Fprin1_to_string (args[argnum], Qnil); */
853 case 'X': /* Lisp expression read and evaluated */
855 Lisp_Object tem = call1 (Qread_expression, PROMPT ());
856 /* visargs[argnum] = Fprin1_to_string (tem, Qnil); */
857 args[argnum] = Feval (tem);
861 case 'Z': /* Coding-system symbol or nil if no prefix */
863 #if defined(MULE) || defined(FILE_CODING)
871 call1 (Qread_non_nil_coding_system, PROMPT ());
879 case 'z': /* Coding-system symbol */
881 #if defined(MULE) || defined(FILE_CODING)
882 args[argnum] = call1 (Qread_coding_system, PROMPT ());
890 /* We have a case for `+' so we get an error
891 if anyone tries to define one here. */
895 error ("Invalid `interactive' control letter \"%c\" (#o%03o).",
896 prompt_data[prompt_index],
897 prompt_data[prompt_index]);
901 if (NILP (visargs[argnum]))
902 visargs[argnum] = args[argnum];
907 prompt_data = (const char *) XSTRING_DATA (specs);
908 prompt_index += prompt_length + 1 + 1; /* +1 to skip spec, +1 for \n */
910 unbind_to (speccount, Qnil);
914 if (EQ (record_flag, Qlambda))
916 RETURN_UNGCPRO (Flist (argcount, args));
919 if (arg_from_tty || !NILP (record_flag))
921 /* Reuse visargs as a temporary for constructing the command history */
922 for (argnum = 0; argnum < argcount; argnum++)
924 if (!NILP (varies[argnum]))
925 visargs[argnum] = list1 (varies[argnum]);
927 visargs[argnum] = Fquote_maybe (args[argnum]);
929 Vcommand_history = Fcons (Fcons (args[-1], Flist (argcount, visargs)),
933 /* If we used a marker to hold point, mark, or an end of the region,
934 temporarily, convert it to an integer now. */
935 for (argnum = 0; argnum < argcount; argnum++)
936 if (!NILP (varies[argnum]))
937 XSETINT (args[argnum], marker_position (args[argnum]));
939 single_console_state ();
940 specbind (Qcommand_debug_status, Qnil);
941 fun = Ffuncall (argcount + 1, args - 1);
943 if (set_zmacs_region_stays)
944 zmacs_region_stays = 1;
945 return unbind_to (speccount, fun);
949 DEFUN ("prefix-numeric-value", Fprefix_numeric_value, 1, 1, 0, /*
950 Return numeric meaning of raw prefix argument RAW.
951 A raw prefix argument is what you get from `(interactive "P")'.
952 Its numeric meaning is what you would get from `(interactive "p")'.
958 if (EQ (raw, Qminus))
959 return make_int (-1);
962 if (CONSP (raw) && INTP (XCAR (raw)))
969 syms_of_callint (void)
971 defsymbol (&Qcall_interactively, "call-interactively");
972 defsymbol (&Qread_from_minibuffer, "read-from-minibuffer");
973 defsymbol (&Qcompleting_read, "completing-read");
974 defsymbol (&Qread_file_name, "read-file-name");
975 defsymbol (&Qread_directory_name, "read-directory-name");
976 defsymbol (&Qread_string, "read-string");
977 defsymbol (&Qread_buffer, "read-buffer");
978 defsymbol (&Qread_variable, "read-variable");
979 defsymbol (&Qread_function, "read-function");
980 defsymbol (&Qread_command, "read-command");
981 defsymbol (&Qread_number, "read-number");
982 defsymbol (&Qread_expression, "read-expression");
983 #if defined(MULE) || defined(FILE_CODING)
984 defsymbol (&Qread_coding_system, "read-coding-system");
985 defsymbol (&Qread_non_nil_coding_system, "read-non-nil-coding-system");
987 defsymbol (&Qevents_to_keys, "events-to-keys");
988 defsymbol (&Qcommand_debug_status, "command-debug-status");
989 defsymbol (&Qenable_recursive_minibuffers, "enable-recursive-minibuffers");
991 defsymbol (&QletX, "let*");
992 defsymbol (&Qsave_excursion, "save-excursion");
993 #if 0 /* ill-conceived */
994 defsymbol (&Qmouse_leave_buffer_hook, "mouse-leave-buffer-hook");
997 DEFSUBR (Finteractive);
998 DEFSUBR (Fquote_maybe);
999 DEFSUBR (Fcall_interactively);
1000 DEFSUBR (Fprefix_numeric_value);
1004 vars_of_callint (void)
1006 DEFVAR_LISP ("current-prefix-arg", &Vcurrent_prefix_arg /*
1007 The value of the prefix argument for this editing command.
1008 It may be a number, or the symbol `-' for just a minus sign as arg,
1009 or a list whose car is a number for just one or more C-U's
1010 or nil if no argument has been specified.
1011 This is what `(interactive "P")' returns.
1013 Vcurrent_prefix_arg = Qnil;
1015 DEFVAR_LISP ("command-history", &Vcommand_history /*
1016 List of recent commands that read arguments from terminal.
1017 Each command is represented as a form to evaluate.
1019 Vcommand_history = Qnil;
1021 DEFVAR_LISP ("command-debug-status", &Vcommand_debug_status /*
1022 Debugging status of current interactive command.
1023 Bound each time `call-interactively' is called;
1024 may be set by the debugger as a reminder for itself.
1026 Vcommand_debug_status = Qnil;
1029 xxDEFVAR_LISP ("mark-even-if-inactive", &Vmark_even_if_inactive /*
1030 *Non-nil means you can use the mark even when inactive.
1031 This option makes a difference in Transient Mark mode.
1032 When the option is non-nil, deactivation of the mark
1033 turns off region highlighting, but commands that use the mark
1034 behave as if the mark were still active.
1036 Vmark_even_if_inactive = Qnil;
1039 #if 0 /* Doesn't work and is totally ill-conceived anyway. */
1040 xxDEFVAR_LISP ("mouse-leave-buffer-hook", &Vmouse_leave_buffer_hook /*
1041 Hook to run when about to switch windows with a mouse command.
1042 Its purpose is to give temporary modes such as Isearch mode
1043 a way to turn themselves off when a mouse command switches windows.
1045 Vmouse_leave_buffer_hook = Qnil;