]> git.eshelyaron.com Git - emacs.git/commitdiff
(set_point): Use virtual bounds, not real bounds,
authorRichard M. Stallman <rms@gnu.org>
Fri, 20 Dec 1996 18:15:52 +0000 (18:15 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 20 Dec 1996 18:15:52 +0000 (18:15 +0000)
in the abort test for POSITION.
Skip the intangibility test if POSITION is at either end of buffer.

src/intervals.c

index de5e3b30f5d7e4d95e25fe0ebb6a958f82b41180..cff718d1f8e1b48c86bba2cffac6eaf50b351b43 100644 (file)
@@ -769,11 +769,43 @@ adjust_intervals_for_insertion (tree, position, length)
      So split this interval at the insertion point.  */
   if (! (position == i->position || eobp)
       && END_NONSTICKY_P (i)
-      && ! FRONT_STICKY_P (i))
+      && FRONT_NONSTICKY_P (i))
     {
-      temp = split_interval_right (i, position - i->position);
-      copy_properties (i, temp);
-      i = temp;
+      Lisp_Object tail;
+      Lisp_Object front, rear;
+
+      front = textget (i->plist, Qfront_sticky);
+      rear  = textget (i->plist, Qrear_nonsticky);
+
+      /* Does any actual property pose an actual problem?  */
+      for (tail = i->plist; ! NILP (tail); tail = Fcdr (Fcdr (tail)))
+       {
+         Lisp_Object prop;
+         prop = XCONS (tail)->car;
+
+         /* Is this particular property rear-sticky?
+            Note, if REAR isn't a cons, it must be non-nil,
+            which means that all properties are rear-nonsticky.  */
+         if (CONSP (rear) && NILP (Fmemq (prop, rear)))
+           continue;
+
+         /* Is this particular property front-sticky?
+            Note, if FRONT isn't a cons, it must be nil,
+            which means that all properties are front-nonsticky.  */
+         if (CONSP (front) && ! NILP (Fmemq (prop, front)))
+           continue;
+
+         /* PROP isn't sticky on either side => it is a real problem.  */
+         break;
+       }
+
+      /* If any property is a real problem, split the interval.  */
+      if (! NILP (tail))
+       {
+         temp = split_interval_right (i, position - i->position);
+         copy_properties (i, temp);
+         i = temp;
+       }
     }
 
   /* If we are positioned between intervals, check the stickiness of