]> git.eshelyaron.com Git - emacs.git/commitdiff
(fix_command): New subroutine, from Fcall_interactively.
authorRichard M. Stallman <rms@gnu.org>
Sun, 23 Feb 2003 15:14:08 +0000 (15:14 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 23 Feb 2003 15:14:08 +0000 (15:14 +0000)
Detect (when ... (region-beginning)) etc.
(Fcall_interactively): Call fix_command.
(Qif, Qwhen): New variables.
(syms_of_callint): Init and staticpro them.

src/ChangeLog
src/callint.c

index 7d27e0b53d82c21e53c53c172725fcb228f68daa..afdc53e33c3299008443793927b9d1fbf414c86a 100644 (file)
@@ -1,3 +1,13 @@
+2003-02-23  Richard M. Stallman  <rms@gnu.org>
+
+       * callint.c (fix_command): New subroutine, from Fcall_interactively.
+       Detect (when ... (region-beginning)) etc.
+       (Fcall_interactively): Call fix_command.
+       (Qif, Qwhen): New variables.
+       (syms_of_callint): Init and staticpro them.
+       
+       * regex.c (print_partial_compiled_pattern): Output to stderr.
+
 2003-02-23  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
 
        * dired.c (directory_files_internal): Don't expand directory.
index 6ce9fb123879d00b64d283f3a916db337739f26c..6decd691b5573178fe19b62198aa8af3e3163bf8 100644 (file)
@@ -51,7 +51,7 @@ Lisp_Object Vmark_even_if_inactive;
 
 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.  */
@@ -315,44 +315,7 @@ supply if the command inquires which events were used to invoke it.  */)
          /* 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);
 
@@ -822,6 +785,70 @@ supply if the command inquires which events were used to invoke it.  */)
   }
 }
 
+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,6 +889,10 @@ syms_of_callint ()
   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");