[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/callint.c
From: |
Richard M. Stallman |
Subject: |
[Emacs-diffs] Changes to emacs/src/callint.c |
Date: |
Sun, 23 Feb 2003 10:13:41 -0500 |
Index: emacs/src/callint.c
diff -c emacs/src/callint.c:1.122 emacs/src/callint.c:1.123
*** emacs/src/callint.c:1.122 Tue Feb 4 09:03:11 2003
--- emacs/src/callint.c Sun Feb 23 10:13:41 2003
***************
*** 51,57 ****
Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
! Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn;
static Lisp_Object preserved_fns;
/* Marker used within call-interactively to refer to point. */
--- 51,57 ----
Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
! Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn, Qif, Qwhen;
static Lisp_Object preserved_fns;
/* Marker used within call-interactively to refer to point. */
***************
*** 315,358 ****
/* 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));
! }
! }
! }
! }
Vcommand_history
= Fcons (Fcons (function, values), Vcommand_history);
--- 315,321 ----
/* 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));
! fix_command (input, values);
Vcommand_history
= Fcons (Fcons (function, values), Vcommand_history);
***************
*** 822,827 ****
--- 785,854 ----
}
}
+ Lisp_Object
+ fix_command (input, values)
+ Lisp_Object input, values;
+ {
+ /* 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))
+ {
+ 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 = Fcdr (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 ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
1, 1, 0,
doc: /* Return numeric meaning of raw prefix argument RAW.
***************
*** 862,867 ****
--- 889,898 ----
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");