diff options
author | Richard M. Stallman <rms@gnu.org> | 1997-05-31 07:38:44 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1997-05-31 07:38:44 +0000 |
commit | 9a81d62e8d5e31332b44c315da9fff792f924780 (patch) | |
tree | 0915beb8bd914664de750cd469692ac045cb3d8d /src | |
parent | 081c9c581ba66188e853cb17428a46dc93113c9f (diff) | |
download | emacs-9a81d62e8d5e31332b44c315da9fff792f924780.tar.gz |
(move_if_not_intangible): New function.
Diffstat (limited to 'src')
-rw-r--r-- | src/intervals.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/intervals.c b/src/intervals.c index e93c2b495a5..ce2adc375f3 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -1853,6 +1853,62 @@ temp_set_point (position, buffer) BUF_PT (buffer) = position; } +/* Move point to POSITION, unless POSITION is inside an intangible + segment that reaches all the way to point. */ + +void +move_if_not_intangible (position) + int position; +{ + Lisp_Object pos; + Lisp_Object intangible_propval; + + XSETINT (pos, position); + + if (! NILP (Vinhibit_point_motion_hooks)) + /* If intangible is inhibited, always move point to POSITION. */ + ; + else if (PT < position) + { + /* We want to move forward, so check the text before POSITION. */ + + intangible_propval = Fget_char_property (pos, + Qintangible, Qnil); + + /* If following char is intangible, + skip back over all chars with matching intangible property. */ + if (! NILP (intangible_propval)) + while (XINT (pos) > BEGV + && EQ (Fget_char_property (make_number (XINT (pos) - 1), + Qintangible, Qnil), + intangible_propval)) + pos = Fprevious_char_property_change (pos, Qnil); + } + else + { + /* We want to move backward, so check the text after POSITION. */ + + intangible_propval = Fget_char_property (make_number (XINT (pos) - 1), + Qintangible, Qnil); + + /* If following char is intangible, + skip back over all chars with matching intangible property. */ + if (! NILP (intangible_propval)) + while (XINT (pos) < ZV + && EQ (Fget_char_property (pos, Qintangible, Qnil), + intangible_propval)) + pos = Fnext_char_property_change (pos, Qnil); + + } + + /* If the whole stretch between PT and POSITION isn't intangible, + try moving to POSITION (which means we actually move farther + if POSITION is inside of intangible text). */ + + if (XINT (pos) != PT) + SET_PT (position); +} + /* Return the proper local map for position POSITION in BUFFER. Use the map specified by the local-map property, if any. Otherwise, use BUFFER's local map. */ |