Mercurial > emacs
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;