/* Call a Lisp function interactively.
- Copyright (C) 1985, 86, 93, 94, 95, 1997, 2000, 2002
+ Copyright (C) 1985, 86, 93, 94, 95, 1997, 2000, 02, 03, 2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
Lisp_Object Vcommand_history;
extern Lisp_Object Vhistory_length;
+extern Lisp_Object Vthis_original_command, real_this_command;
Lisp_Object Vcommand_debug_status, Qcommand_debug_status;
Lisp_Object Qenable_recursive_minibuffers;
Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
-Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn;
+Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn, Qif, Qwhen;
static Lisp_Object preserved_fns;
/* Marker used within call-interactively to refer to point. */
Fsignal (Qmark_inactive, Qnil);
}
+/* If the list of args INPUT was produced with an explicit call to
+ `list', look for elements that were computed with
+ (region-beginning) or (region-end), and put those expressions into
+ VALUES instead of the present values.
+
+ This function doesn't return a value because it modifies elements
+ of VALUES to do its job. */
+
+static void
+fix_command (input, values)
+ Lisp_Object input, values;
+{
+ if (CONSP (input))
+ {
+ Lisp_Object car;
+
+ car = XCAR (input);
+ /* Skip through certain special forms. */
+ while (EQ (car, Qlet) || EQ (car, Qletx)
+ || EQ (car, Qsave_excursion)
+ || EQ (car, Qprogn))
+ {
+ while (CONSP (XCDR (input)))
+ input = XCDR (input);
+ input = XCAR (input);
+ if (!CONSP (input))
+ break;
+ car = XCAR (input);
+ }
+ if (EQ (car, Qlist))
+ {
+ Lisp_Object intail, valtail;
+ for (intail = Fcdr (input), valtail = values;
+ CONSP (valtail);
+ intail = Fcdr (intail), valtail = XCDR (valtail))
+ {
+ Lisp_Object elt;
+ elt = Fcar (intail);
+ if (CONSP (elt))
+ {
+ Lisp_Object presflag, carelt;
+ carelt = Fcar (elt);
+ /* If it is (if X Y), look at Y. */
+ if (EQ (carelt, Qif)
+ && EQ (Fnthcdr (make_number (3), elt), Qnil))
+ elt = Fnth (make_number (2), elt);
+ /* If it is (when ... Y), look at Y. */
+ else if (EQ (carelt, Qwhen))
+ {
+ while (CONSP (XCDR (elt)))
+ elt = XCDR (elt);
+ elt = Fcar (elt);
+ }
+
+ /* If the function call we're looking at
+ is a special preserved one, copy the
+ whole expression for this argument. */
+ if (CONSP (elt))
+ {
+ presflag = Fmemq (Fcar (elt), preserved_fns);
+ if (!NILP (presflag))
+ Fsetcar (valtail, Fcar (intail));
+ }
+ }
+ }
+ }
+ }
+}
DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0,
doc: /* Call FUNCTION, reading args according to its interactive calling specs.
means unconditionally put this command in the command-history.
Otherwise, this is done only if an arg is read using the minibuffer.
Optional third arg KEYS, if given, specifies the sequence of events to
-supply if the command inquires which events were used to invoke it. */)
+supply if the command inquires which events were used to invoke it.
+If KEYS is omitted or nil, the return value of `this-command-keys' is used. */)
(function, record_flag, keys)
Lisp_Object function, record_flag, keys;
{
int key_count;
int record_then_fail = 0;
+ Lisp_Object save_this_command, save_last_command;
+ Lisp_Object save_this_original_command, save_real_this_command;
+
+ save_this_command = Vthis_command;
+ save_this_original_command = Vthis_original_command;
+ save_real_this_command = real_this_command;
+ save_last_command = current_kboard->Vlast_command;
+
if (NILP (keys))
keys = this_command_keys, key_count = this_command_key_count;
else
goto lose;
specs = XVECTOR (fun)->contents[COMPILED_INTERACTIVE];
}
- else if (!CONSP (fun))
- goto lose;
- else if (funcar = XCAR (fun), EQ (funcar, Qautoload))
+ else
{
+ Lisp_Object form;
GCPRO2 (function, prefix_arg);
- do_autoload (fun, function);
+ form = Finteractive_form (function);
UNGCPRO;
- goto retry;
- }
- else if (EQ (funcar, Qlambda))
- {
- specs = Fassq (Qinteractive, Fcdr (XCDR (fun)));
- if (NILP (specs))
+ if (CONSP (form))
+ specs = filter_specs = Fcar (XCDR (form));
+ else
goto lose;
- filter_specs = Fnth (make_number (1), specs);
- specs = Fcar (Fcdr (specs));
}
- else
- goto lose;
/* If either SPECS or STRING is set to a string, use it. */
if (STRINGP (specs))
if (i != num_input_events || !NILP (record_flag))
{
/* We should record this command on the command history. */
- Lisp_Object values, car;
+ Lisp_Object values;
/* Make a copy of the list of values, for the command history,
and turn them into things we can eval. */
values = quotify_args (Fcopy_sequence (specs));
- /* If the list of args was produced with an explicit call to `list',
- look for elements that were computed with (region-beginning)
- or (region-end), and put those expressions into VALUES
- instead of the present values. */
- if (CONSP (input))
- {
- car = XCAR (input);
- /* Skip through certain special forms. */
- while (EQ (car, Qlet) || EQ (car, Qletx)
- || EQ (car, Qsave_excursion)
- || EQ (car, Qprogn))
- {
- while (CONSP (XCDR (input)))
- input = XCDR (input);
- input = XCAR (input);
- if (!CONSP (input))
- break;
- car = XCAR (input);
- }
- if (EQ (car, Qlist))
- {
- Lisp_Object intail, valtail;
- for (intail = Fcdr (input), valtail = values;
- CONSP (valtail);
- intail = Fcdr (intail), valtail = Fcdr (valtail))
- {
- Lisp_Object elt;
- elt = Fcar (intail);
- if (CONSP (elt))
- {
- Lisp_Object presflag;
- presflag = Fmemq (Fcar (elt), preserved_fns);
- if (!NILP (presflag))
- Fsetcar (valtail, Fcar (intail));
- }
- }
- }
- }
+ fix_command (input, values);
Vcommand_history
= Fcons (Fcons (function, values), Vcommand_history);
XSETCDR (teml, Qnil);
}
}
+
+ Vthis_command = save_this_command;
+ Vthis_original_command = save_this_original_command;
+ real_this_command= save_real_this_command;
+ current_kboard->Vlast_command = save_last_command;
+
single_kboard_state ();
return apply1 (function, specs);
}
if (!NILP (Vmouse_leave_buffer_hook))
call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
- Fselect_window (event);
+ Fselect_window (event, Qnil);
}
string++;
}
Qnil, Qnil, Qnil, Qnil);
unbind_to (speccount1, Qnil);
teml = args[i];
- visargs[i] = Fkey_description (teml);
+ visargs[i] = Fkey_description (teml, Qnil);
/* If the key sequence ends with a down-event,
discard the following up-event. */
args[i] = Fread_key_sequence (build_string (callint_message),
Qnil, Qt, Qnil, Qnil);
teml = args[i];
- visargs[i] = Fkey_description (teml);
+ visargs[i] = Fkey_description (teml, Qnil);
unbind_to (speccount1, Qnil);
/* If the key sequence ends with a down-event,
args[i] = Qnil;
varies[i] = -1;
}
- else
+ else
{
args[i]
= Fread_non_nil_coding_system (build_string (callint_message));
if (record_then_fail)
Fbarf_if_buffer_read_only ();
+ Vthis_command = save_this_command;
+ Vthis_original_command = save_this_original_command;
+ real_this_command= save_real_this_command;
+ current_kboard->Vlast_command = save_last_command;
+
single_kboard_state ();
{
UNGCPRO;
return unbind_to (speccount, val);
}
-}
+}
DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
1, 1, 0,
Lisp_Object raw;
{
Lisp_Object val;
-
+
if (NILP (raw))
XSETFASTINT (val, 1);
else if (EQ (raw, Qminus))
staticpro (&Qlist);
Qlet = intern ("let");
staticpro (&Qlet);
+ Qif = intern ("if");
+ staticpro (&Qif);
+ Qwhen = intern ("when");
+ staticpro (&Qwhen);
Qletx = intern ("let*");
staticpro (&Qletx);
Qsave_excursion = intern ("save-excursion");
defsubr (&Scall_interactively);
defsubr (&Sprefix_numeric_value);
}
+
+/* arch-tag: a3a7cad7-bcac-42ce-916e-1bd2546ebf37
+ (do not change this comment) */