]> granicus.if.org Git - vim/commitdiff
patch 8.1.1338: hang when concealing the '>' shown for half of wide char v8.1.1338
authorBram Moolenaar <Bram@vim.org>
Fri, 17 May 2019 10:31:44 +0000 (12:31 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 17 May 2019 10:31:44 +0000 (12:31 +0200)
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)

src/screen.c
src/version.c

index cbb0fa4c7db52a8b44c1806bda5a8f185cd79df9..cab697fd2aeb8f41ec40e244c232384b449c082c 100644 (file)
@@ -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
index c34eed04f664b2c62bbad593918ba048455163d6..91ea91424315252ad84c1dad5add10f30f06b17e 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1338,
 /**/
     1337,
 /**/