summaryrefslogtreecommitdiff
path: root/src/intervals.c
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1995-05-02 23:06:11 +0000
committerKarl Heuer <kwzh@gnu.org>1995-05-02 23:06:11 +0000
commitc89ca53993dae5625afe604fb9d0a4e847e5be70 (patch)
tree4acb380dfc192f8861d16c1cc6478cccefe9bc94 /src/intervals.c
parent7cebc4ee0b4d621fceb6012e558792e7a5d394a6 (diff)
downloademacs-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.c32
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;