changeset 16672:8abd2cb8441c v8.1.1338

patch 8.1.1338: hang when concealing the '>' shown for half of wide char commit https://github.com/vim/vim/commit/0ebe12be86d9f79bfa833306a0302a68a0f4fc30 Author: Bram Moolenaar <Bram@vim.org> Date: Fri May 17 12:31:44 2019 +0200 patch 8.1.1338: hang when concealing the '>' shown for half of wide char Problem: Hang when concealing the '>' shown for a wide char that doesn't fit in the last cell. Solution: Put back the pointer when the '>' is not going to be displayed. (closes #4377)
author Bram Moolenaar <Bram@vim.org>
date Fri, 17 May 2019 12:45:06 +0200
parents 10cee1b8fcb3
children a49b12c730e7
files src/screen.c src/version.c
diffstat 2 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -3176,7 +3176,6 @@ win_line(
     int		vcol_off	= 0;	/* offset for concealed characters */
     int		did_wcol	= FALSE;
     int		match_conc	= 0;	/* cchar for match functions */
-    int		has_match_conc  = 0;	/* match wants to conceal */
     int		old_boguscols   = 0;
 # define VCOL_HLC (vcol - vcol_off)
 # define FIX_FOR_BOGUSCOLS \
@@ -3747,7 +3746,8 @@ win_line(
     for (;;)
     {
 #ifdef FEAT_CONCEAL
-	has_match_conc = 0;
+	int has_match_conc  = 0;	// match wants to conceal
+	int did_decrement_ptr = FALSE;
 #endif
 	/* Skip this quickly when working on the text. */
 	if (draw_state != WL_LINE)
@@ -4596,9 +4596,12 @@ win_line(
 		    mb_utf8 = FALSE;
 		    mb_l = 1;
 		    multi_attr = HL_ATTR(HLF_AT);
-		    /* Put pointer back so that the character will be
-		     * displayed at the start of the next line. */
+		    // Put pointer back so that the character will be
+		    // displayed at the start of the next line.
 		    --ptr;
+#ifdef FEAT_CONCEAL
+		    did_decrement_ptr = TRUE;
+#endif
 		}
 		else if (*ptr != NUL)
 		    ptr += mb_l - 1;
@@ -5261,7 +5264,12 @@ win_line(
 		prev_syntax_id = 0;
 		is_concealing = FALSE;
 	    }
-#endif /* FEAT_CONCEAL */
+
+	    if (n_skip > 0 && did_decrement_ptr)
+		// not showing the '>', put pointer back to avoid getting stuck
+		++ptr;
+
+#endif // FEAT_CONCEAL
 	}
 
 #ifdef FEAT_CONCEAL
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1338,
+/**/
     1337,
 /**/
     1336,