changeset 9072:21517199cfae

(set_point): If Vinhibit_point_motion_hooks, ignore intangible properties. If move backwards into intangible text, move back over it.
author Richard M. Stallman <rms@gnu.org>
date Sat, 24 Sep 1994 09:13:57 +0000
parents 2d4d0f6e7be0
children 43aa8427db01
files src/intervals.c
diffstat 1 files changed, 46 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/intervals.c	Sat Sep 24 07:24:30 1994 +0000
+++ b/src/intervals.c	Sat Sep 24 09:13:57 1994 +0000
@@ -1651,17 +1651,54 @@
       return;
     }
 
-  /* If the new position is before an intangible character,
-     move forward over all such.  */
-  while (! NULL_INTERVAL_P (to)
-	 && ! NILP (textget (to->plist, Qintangible)))
+  /* If the new position is between two intangible characters,
+     move forward or backward across all such characters.  */
+  if (NILP (Vinhibit_point_motion_hooks) && ! NULL_INTERVAL_P (to)
+      && ! NULL_INTERVAL_P (toprev))
     {
-      toprev = to;
-      to = next_interval (to);
-      if (NULL_INTERVAL_P (to))
-	position = BUF_ZV (buffer);
+      if (backwards)
+	{
+	  /* Make sure the following character is intangible
+	     if the previous one is.  */
+	  if (toprev == to
+	      || ! NILP (textget (to->plist, Qintangible)))
+	    /* Ok, that is so.  Back up across intangible text.  */
+	    while (! NULL_INTERVAL_P (toprev)
+		   && ! NILP (textget (toprev->plist, Qintangible)))
+	      {
+		to = toprev;
+		toprev = previous_interval (toprev);
+		if (NULL_INTERVAL_P (toprev))
+		  position = BUF_BEGV (buffer);
+		else
+		  /* This is the only line that's not
+		     dual to the following loop.
+		     That's because we want the position
+		     at the end of TOPREV.  */
+		  position = to->position;
+	      }
+	}
       else
-	position = to->position;
+	{
+	  /* Make sure the previous character is intangible
+	     if the following one is.  */
+	  if (toprev == to
+	      || ! NILP (textget (toprev->plist, Qintangible)))
+	    /* Ok, that is so.  Advance across intangible text.  */
+	    while (! NULL_INTERVAL_P (to)
+		   && ! NILP (textget (to->plist, Qintangible)))
+	      {
+		toprev = to;
+		to = next_interval (to);
+		if (NULL_INTERVAL_P (to))
+		  position = BUF_ZV (buffer);
+		else
+		  position = to->position;
+	      }
+	}
+      /* Here TO is the interval after the stopping point
+	 and TOPREV is the interval before the stopping point.
+	 One or the other may be null.  */
     }
 
   buffer->text.pt = position;