Give each syntax item a sequence number, so that we know when it starts and
can show the 'cchar' for each of them.
diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro
index 12dc9de..7ae13e9 100644
--- a/src/proto/syntax.pro
+++ b/src/proto/syntax.pro
@@ -15,7 +15,7 @@
 void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg));
 char_u *get_syntax_name __ARGS((expand_T *xp, int idx));
 int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp, int keep_state));
-int get_syntax_info __ARGS((int *idp));
+int get_syntax_info __ARGS((int *seqnrp));
 int syn_get_sub_char __ARGS((void));
 int syn_get_stack_item __ARGS((int i));
 int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
diff --git a/src/screen.c b/src/screen.c
index 1756fc0..e7c3ad2 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2816,7 +2816,7 @@
 
 #ifdef FEAT_CONCEAL
     int		syntax_flags	= 0;
-    int		syntax_id	= 0;
+    int		syntax_seqnr	= 0;
     int		prev_syntax_id	= 0;
     int		conceal_attr	= hl_attr(HLF_CONCEAL);
     int		is_concealing	= FALSE;
@@ -4099,7 +4099,7 @@
 		    if (c == NUL)
 			syntax_flags = 0;
 		    else
-			syntax_flags = get_syntax_info(&syntax_id);
+			syntax_flags = get_syntax_info(&syntax_seqnr);
 # endif
 		}
 #endif
@@ -4430,7 +4430,7 @@
 		&& !lnum_in_visual_area)
 	    {
 		char_attr = conceal_attr;
-		if (prev_syntax_id != syntax_id
+		if (prev_syntax_id != syntax_seqnr
 			&& (syn_get_sub_char() != NUL || wp->w_p_cole == 1)
 			&& wp->w_p_cole != 3)
 		{
@@ -4443,7 +4443,7 @@
 		    else
 			c = ' ';
 
-		    prev_syntax_id = syntax_id;
+		    prev_syntax_id = syntax_seqnr;
 
 		    if (n_extra > 0)
 			vcol_off += n_extra;
diff --git a/src/syntax.c b/src/syntax.c
index 5880803..099e0a7 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -196,6 +196,7 @@
 static int current_trans_id = 0;    /* idem, transparency removed */
 #endif
 #ifdef FEAT_CONCEAL
+static int current_seqnr = 0;
 static int current_flags = 0;
 static int current_sub_char = 0;
 #endif
@@ -287,6 +288,7 @@
 					 * HL_SKIP* for si_next_list */
 #ifdef FEAT_CONCEAL
     int		si_char;		/* substitution character for conceal */
+    int		si_seqnr;		/* sequence number */
 #endif
     short	*si_cont_list;		/* list of contained groups */
     short	*si_next_list;		/* nextgroup IDs after this item ends */
@@ -298,6 +300,10 @@
 #define ID_LIST_ALL	(short *)-1 /* valid of si_cont_list for containing all
 				       but contained groups */
 
+#ifdef FEAT_CONCEAL
+static int next_seqnr = 0;		/* value to use for si_seqnr */
+#endif
+
 /*
  * Struct to reduce the number of arguments to get_syn_options(), it's used
  * very often.
@@ -1949,6 +1955,7 @@
 			cur_si->si_end_idx = 0;
 			cur_si->si_flags = flags;
 #ifdef FEAT_CONCEAL
+			cur_si->si_seqnr = next_seqnr++;
 			cur_si->si_char = cchar;
 			if (current_state.ga_len > 1)
 			    cur_si->si_flags |=
@@ -2280,6 +2287,7 @@
 #ifdef FEAT_CONCEAL
 		current_flags = sip->si_flags;
 		current_sub_char = sip->si_char;
+		current_seqnr = sip->si_seqnr;
 #endif
 		break;
 	    }
@@ -2433,6 +2441,7 @@
 	cur_si->si_m_lnum = current_lnum;
 	cur_si->si_flags = spp->sp_flags;
 #ifdef FEAT_CONCEAL
+	cur_si->si_seqnr = next_seqnr++;
 	cur_si->si_char = spp->sp_char;
 	if (current_state.ga_len > 1)
 	    cur_si->si_flags |=
@@ -6336,14 +6345,14 @@
 /*
  * Get extra information about the syntax item.  Must be called right after
  * get_syntax_attr().
- * Stores the current item ID in "*idp".
+ * Stores the current item sequence nr in "*seqnrp".
  * Returns the current flags.
  */
     int
-get_syntax_info(idp)
-    int		*idp;
+get_syntax_info(seqnrp)
+    int		*seqnrp;
 {
-    *idp = current_id;
+    *seqnrp = current_seqnr;
     return current_flags;
 }