[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 4e5eb85: Fix subtle problems with linum-mode and in
From: |
Eli Zaretskii |
Subject: |
[Emacs-diffs] master 4e5eb85: Fix subtle problems with linum-mode and invisible text |
Date: |
Sun, 15 Mar 2015 17:19:08 +0000 |
branch: master
commit 4e5eb85425214d62cd3962914565b281b74504ce
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>
Fix subtle problems with linum-mode and invisible text
src/xdisp.c (handle_invisible_prop): Fix up it->position even when
we are going to load overlays at the beginning of the invisible
text.
(setup_for_ellipsis): Reset the ignore_overlay_strings_at_pos_p
flag also here.
(next_overlay_string): Set the overlay_strings_at_end_processed_p
flag only if the overlays just processed were actually loaded at
EOB.
---
src/ChangeLog | 11 +++++++++++
src/xdisp.c | 56 +++++++++++++++++++++++++++++++++++++-------------------
2 files changed, 48 insertions(+), 19 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index cb4aad6..e328afc 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,14 @@
+2015-03-15 Eli Zaretskii <address@hidden>
+
+ * xdisp.c (handle_invisible_prop): Fix up it->position even when
+ we are going to load overlays at the beginning of the invisible
+ text.
+ (setup_for_ellipsis): Reset the ignore_overlay_strings_at_pos_p
+ flag also here.
+ (next_overlay_string): Set the overlay_strings_at_end_processed_p
+ flag only if the overlays just processed were actually loaded at
+ EOB.
+
2015-03-14 Daniel Colascione <address@hidden>
* emacs.c (standard_args): Add --no-x-resources.
diff --git a/src/xdisp.c b/src/xdisp.c
index ce685fd..a17f5a9 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4412,6 +4412,27 @@ handle_invisible_prop (struct it *it)
IT_BYTEPOS (*it) = CHAR_TO_BYTE (newpos);
}
+ if (display_ellipsis_p)
+ {
+ /* Make sure that the glyphs of the ellipsis will get
+ correct `charpos' values. If we would not update
+ it->position here, the glyphs would belong to the
+ last visible character _before_ the invisible
+ text, which confuses `set_cursor_from_row'.
+
+ We use the last invisible position instead of the
+ first because this way the cursor is always drawn on
+ the first "." of the ellipsis, whenever PT is inside
+ the invisible text. Otherwise the cursor would be
+ placed _after_ the ellipsis when the point is after the
+ first invisible character. */
+ if (!STRINGP (it->object))
+ {
+ it->position.charpos = newpos - 1;
+ it->position.bytepos = CHAR_TO_BYTE (it->position.charpos);
+ }
+ }
+
/* If there are before-strings at the start of invisible
text, and the text is invisible because of a text
property, arrange to show before-strings because 20.x did
@@ -4443,23 +4464,6 @@ handle_invisible_prop (struct it *it)
}
else if (display_ellipsis_p)
{
- /* Make sure that the glyphs of the ellipsis will get
- correct `charpos' values. If we would not update
- it->position here, the glyphs would belong to the
- last visible character _before_ the invisible
- text, which confuses `set_cursor_from_row'.
-
- We use the last invisible position instead of the
- first because this way the cursor is always drawn on
- the first "." of the ellipsis, whenever PT is inside
- the invisible text. Otherwise the cursor would be
- placed _after_ the ellipsis when the point is after the
- first invisible character. */
- if (!STRINGP (it->object))
- {
- it->position.charpos = newpos - 1;
- it->position.bytepos = CHAR_TO_BYTE (it->position.charpos);
- }
it->ellipsis_p = true;
/* Let the ellipsis display before
considering any properties of the following char.
@@ -4504,6 +4508,11 @@ setup_for_ellipsis (struct it *it, int len)
if (it->saved_face_id < 0 || it->saved_face_id != it->face_id)
it->saved_face_id = it->face_id = DEFAULT_FACE_ID;
+ /* If the ellipsis represents buffer text, it means we advanced in
+ the buffer, so we should no longer ignore overlay strings. */
+ if (it->method == GET_FROM_BUFFER)
+ it->ignore_overlay_strings_at_pos_p = false;
+
it->method = GET_FROM_DISPLAY_VECTOR;
it->ellipsis_p = true;
}
@@ -5427,7 +5436,6 @@ next_overlay_string (struct it *it)
&& it->stop_charpos <= it->end_charpos));
it->current.overlay_string_index = -1;
it->n_overlay_strings = 0;
- it->overlay_strings_charpos = -1;
/* If there's an empty display string on the stack, pop the
stack, to resync the bidi iterator with IT's position. Such
empty strings are pushed onto the stack in
@@ -5444,8 +5452,18 @@ next_overlay_string (struct it *it)
/* If we're at the end of the buffer, record that we have
processed the overlay strings there already, so that
next_element_from_buffer doesn't try it again. */
- if (NILP (it->string) && IT_CHARPOS (*it) >= it->end_charpos)
+ if (NILP (it->string)
+ && IT_CHARPOS (*it) >= it->end_charpos
+ && it->overlay_strings_charpos >= it->end_charpos)
it->overlay_strings_at_end_processed_p = true;
+ /* Note: we reset overlay_strings_charpos only here, to make
+ sure the just-processed overlays were indeed at EOB.
+ Otherwise, overlays on text with invisible text property,
+ which are processed with IT's position past the invisible
+ text, might fool us into thinking the overlays at EOB were
+ already processed (linum-mode can cause this, for
+ example). */
+ it->overlay_strings_charpos = -1;
}
else
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 4e5eb85: Fix subtle problems with linum-mode and invisible text,
Eli Zaretskii <=