changeset 11327:76908dad81a4

(set_point): When skipping intangible text, stop where property value changes.
author Richard M. Stallman <rms@gnu.org>
date Sun, 09 Apr 1995 09:42:28 +0000
parents 0d5ebc078c51
children 54e681a175d2
files src/intervals.c
diffstat 1 files changed, 27 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/intervals.c	Sun Apr 09 09:34:05 1995 +0000
+++ b/src/intervals.c	Sun Apr 09 09:42:28 1995 +0000
@@ -1644,20 +1644,24 @@
       return;
     }
 
-  /* If the new position is between two intangible characters,
-     move forward or backward across all such characters.  */
+  /* If the new position is between two intangible characters
+     with the same intangible property value,
+     move forward or backward until a change in that property.  */
   if (NILP (Vinhibit_point_motion_hooks) && ! NULL_INTERVAL_P (to)
       && ! NULL_INTERVAL_P (toprev))
     {
       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)))
+	  Lisp_Object intangible_propval;
+	  intangible_propval = textget (to->plist, Qintangible);
+
+	  /* If following char is intangible,
+	     skip back over all chars with matching intangible property.  */
+	  if (! NILP (intangible_propval))
+	    while (to == toprev
+		   || ((! NULL_INTERVAL_P (toprev)
+			&& EQ (textget (toprev->plist, Qintangible),
+			       intangible_propval))))
 	      {
 		to = toprev;
 		toprev = previous_interval (toprev);
@@ -1673,13 +1677,16 @@
 	}
       else
 	{
-	  /* 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)))
+	  Lisp_Object intangible_propval;
+	  intangible_propval = textget (toprev->plist, Qintangible);
+
+	  /* If previous char is intangible,
+	     skip fwd over all chars with matching intangible property.  */
+	  if (! NILP (intangible_propval))
+	    while (to == toprev
+		   || ((! NULL_INTERVAL_P (to)
+			&& EQ (textget (to->plist, Qintangible),
+			       intangible_propval))))
 	      {
 		toprev = to;
 		to = next_interval (to);
@@ -1689,11 +1696,12 @@
 		  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.  */
     }
 
+  /* 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.  */
+
   BUF_PT (buffer) = position;
 
   /* We run point-left and point-entered hooks here, iff the