diff options
author | Karl Heuer <kwzh@gnu.org> | 1995-05-02 23:06:11 +0000 |
---|---|---|
committer | Karl Heuer <kwzh@gnu.org> | 1995-05-02 23:06:11 +0000 |
commit | c89ca53993dae5625afe604fb9d0a4e847e5be70 (patch) | |
tree | 4acb380dfc192f8861d16c1cc6478cccefe9bc94 /src/intervals.c | |
parent | 7cebc4ee0b4d621fceb6012e558792e7a5d394a6 (diff) | |
download | emacs-c89ca53993dae5625afe604fb9d0a4e847e5be70.tar.gz |
(get_local_map): Use Fget_char_property, so that
overlay properties will be considered as well as text properties.
Diffstat (limited to 'src/intervals.c')
-rw-r--r-- | src/intervals.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/intervals.c b/src/intervals.c index 26fcfd9e701..bf51d14d1cd 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -1762,24 +1762,34 @@ get_local_map (position, buffer) register int position; register struct buffer *buffer; { - register INTERVAL interval; - Lisp_Object prop, tem; - - if (NULL_INTERVAL_P (BUF_INTERVALS (buffer))) - return buffer->keymap; + Lisp_Object prop, tem, lispy_position, lispy_buffer; + int old_begv, old_zv; /* Perhaps we should just change `position' to the limit. */ if (position > BUF_Z (buffer) || position < BUF_BEG (buffer)) abort (); - interval = find_interval (BUF_INTERVALS (buffer), position); - prop = textget (interval->plist, Qlocal_map); - if (NILP (prop)) - return buffer->keymap; + /* Ignore narrowing, so that a local map continues to be valid even if + the visible region contains no characters and hence no properties. */ + old_begv = BUF_BEGV (buffer); + old_zv = BUF_ZV (buffer); + BUF_BEGV (buffer) = BUF_BEG (buffer); + BUF_ZV (buffer) = BUF_Z (buffer); + + /* There are no properties at the end of the buffer, so in that case + check for a local map on the last character of the buffer instead. */ + if (position == BUF_Z (buffer) && BUF_Z (buffer) > BUF_BEG (buffer)) + --position; + XSETFASTINT (lispy_position, position); + XSETBUFFER (lispy_buffer, buffer); + prop = Fget_char_property (lispy_position, Qlocal_map, lispy_buffer); + + BUF_BEGV (buffer) = old_begv; + BUF_ZV (buffer) = old_zv; /* Use the local map only if it is valid. */ - tem = Fkeymapp (prop); - if (!NILP (tem)) + if (!NILP (prop) + && (tem = Fkeymapp (prop), !NILP (tem))) return prop; return buffer->keymap; |