Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
-Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion;
+Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn;
static Lisp_Object preserved_fns;
/* Marker used within call-interactively to refer to point. */
Lisp_Object fun;
Lisp_Object funcar;
Lisp_Object specs;
+ Lisp_Object filter_specs;
Lisp_Object teml;
Lisp_Object enable;
int speccount = SPECPDL_INDEX ();
int arg_from_tty = 0;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
int key_count;
+ int record_then_fail = 0;
if (NILP (keys))
keys = this_command_keys, key_count = this_command_key_count;
specs = Qnil;
string = 0;
+ /* The idea of FILTER_SPECS is to provide away to
+ specify how to represent the arguments in command history.
+ The feature is not fully implemented. */
+ filter_specs = Qnil;
/* Decode the kind of function. Either handle it and return,
or go to `lose' if not interactive, or go to `retry'
specs = Fassq (Qinteractive, Fcdr (XCDR (fun)));
if (NILP (specs))
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 either SPECS or STRING is set to a string, use it. */
if (STRINGP (specs))
{
/* Make a copy of string so that if a GC relocates specs,
i = num_input_events;
input = specs;
/* Compute the arg values using the user's expression. */
+ GCPRO2 (input, filter_specs);
specs = Feval (specs);
+ UNGCPRO;
if (i != num_input_events || !NILP (record_flag))
{
/* We should record this command on the command history. */
car = XCAR (input);
/* Skip through certain special forms. */
while (EQ (car, Qlet) || EQ (car, Qletx)
- || EQ (car, Qsave_excursion))
+ || EQ (car, Qsave_excursion)
+ || EQ (car, Qprogn))
{
while (CONSP (XCDR (input)))
input = XCDR (input);
for (next_event = 0; next_event < key_count; next_event++)
if (EVENT_HAS_PARAMETERS (XVECTOR (keys)->contents[next_event]))
break;
-
+
/* Handle special starting chars `*' and `@'. Also `-'. */
/* Note that `+' is reserved for user extensions. */
while (1)
{
string++;
if (!NILP (current_buffer->read_only))
- Fbarf_if_buffer_read_only ();
+ {
+ if (!NILP (record_flag))
+ {
+ unsigned char *p = string;
+ while (*p)
+ {
+ if (! (*p == 'r' || *p == 'p' || *p == 'P'
+ || *p == '\n'))
+ Fbarf_if_buffer_read_only ();
+ p++;
+ }
+ record_then_fail = 1;
+ }
+ else
+ Fbarf_if_buffer_read_only ();
+ }
}
/* Ignore this for semi-compatibility with Lucid. */
else if (*string == '-')
{
Lisp_Object event;
- event = XVECTOR (keys)->contents[next_event];
+ event = (next_event < key_count
+ ? XVECTOR (keys)->contents[next_event]
+ : Qnil);
if (EVENT_HAS_PARAMETERS (event)
&& (event = XCDR (event), CONSP (event))
&& (event = XCAR (event), CONSP (event))
if (varies[i] >= 1 && varies[i] <= 4)
XSETINT (args[i], marker_position (args[i]));
+ if (record_then_fail)
+ Fbarf_if_buffer_read_only ();
+
single_kboard_state ();
{
staticpro (&Qletx);
Qsave_excursion = intern ("save-excursion");
staticpro (&Qsave_excursion);
+ Qprogn = intern ("progn");
+ staticpro (&Qprogn);
Qminus = intern ("-");
staticpro (&Qminus);