changeset 48527:ba7cb9f8dfc3

(Fcall_interactively): If a command fails because `*' detects a read-only buffer, but RECORD_FLAG is set, record it anyway if the args don't actually do tty input.
author Richard M. Stallman <rms@gnu.org>
date Sun, 24 Nov 2002 19:04:25 +0000
parents cd3075e04573
children 467b0e57d985
files src/callint.c
diffstat 1 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/callint.c	Sun Nov 24 19:02:14 2002 +0000
+++ b/src/callint.c	Sun Nov 24 19:04:25 2002 +0000
@@ -221,6 +221,7 @@
   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;
@@ -289,7 +290,7 @@
   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,
@@ -373,7 +374,7 @@
   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)
@@ -384,7 +385,22 @@
 	{
 	  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 == '-')
@@ -789,6 +805,9 @@
     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 ();
 
   {