diff src/screen.c @ 2375:a96dd77ce213 vim73

For conceal mode: when two different syntax items follow each other, show the replacement character for both.
author Bram Moolenaar <bram@vim.org>
date Thu, 22 Jul 2010 22:16:29 +0200
parents 151b037b7e74
children 85b7dc8da5eb
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -2775,8 +2775,9 @@ win_line(wp, lnum, startrow, endrow, noc
 
 #ifdef FEAT_CONCEAL
     int		syntax_flags	= 0;
+    int		syntax_id	= 0;
+    int		prev_syntax_id	= 0;
     int		conceal_attr	= hl_attr(HLF_CONCEAL);
-    int		first_conceal	= (wp->w_p_conc != 3);
     int		is_concealing	= FALSE;
     int		boguscols	= 0;	/* nonexistent columns added to force
 					   wrapping */
@@ -4028,11 +4029,6 @@ win_line(wp, lnum, startrow, endrow, noc
 		    did_emsg = FALSE;
 
 		    syntax_attr = get_syntax_attr((colnr_T)v - 1,
-# ifdef FEAT_CONCEAL
-						&syntax_flags,
-# else
-						NULL,
-# endif
 # ifdef FEAT_SPELL
 						has_spell ? &can_spell :
 # endif
@@ -4060,6 +4056,8 @@ win_line(wp, lnum, startrow, endrow, noc
 		     * with line highlighting */
 		    if (c == NUL)
 			syntax_flags = 0;
+		    else
+			syntax_flags = get_syntax_info(&syntax_id);
 # endif
 		}
 #endif
@@ -4388,9 +4386,12 @@ win_line(wp, lnum, startrow, endrow, noc
 		&& (syntax_flags & HL_CONCEAL) != 0)
 	    {
 		char_attr = conceal_attr;
-		if (first_conceal
-			&& (syn_get_sub_char() != NUL || wp->w_p_conc == 1))
-		{
+		if (prev_syntax_id != syntax_id
+			&& (syn_get_sub_char() != NUL || wp->w_p_conc == 1)
+			&& wp->w_p_conc != 3)
+		{
+		    /* First time at this concealed item: display one
+		     * character. */
 		    if (syn_get_sub_char() != NUL)
 			c = syn_get_sub_char();
 		    else if (lcs_conceal != NUL)
@@ -4398,7 +4399,7 @@ win_line(wp, lnum, startrow, endrow, noc
 		    else
 			c = ' ';
 
-		    first_conceal = FALSE;
+		    prev_syntax_id = syntax_id;
 
 		    if (n_extra > 0)
 			vcol_off += n_extra;
@@ -4440,7 +4441,7 @@ win_line(wp, lnum, startrow, endrow, noc
 	    }
 	    else
 	    {
-		first_conceal = (wp->w_p_conc != 3);
+		prev_syntax_id = 0;
 		is_concealing = FALSE;
 	    }
 #endif /* FEAT_CONCEAL */