diff -r 538ff809ae53 src/syntax.c
--- a/src/syntax.c	Thu Nov 29 20:10:00 2012 +0100
+++ b/src/syntax.c	Mon Dec 03 19:11:46 2012 -0800
@@ -289,8 +289,9 @@
     int		si_end_idx;		/* group ID for end pattern or zero */
     int		si_ends;		/* if match ends before si_m_endpos */
     int		si_attr;		/* attributes in this state */
-    long	si_flags;		/* HL_HAS_EOL flag in this state, and
-					 * HL_SKIP* for si_next_list */
+    long	si_flags;		/* HL_HAS_EOL flag in this state,
+					 * HL_SKIP* for si_next_list, and
+					 * HL_COMBINE for combining. */
 #ifdef FEAT_CONCEAL
     int		si_seqnr;		/* sequence number */
     int		si_cchar;		/* substitution character for conceal */
@@ -315,7 +316,8 @@
  */
 typedef struct
 {
-    int		flags;		/* flags for contained and transparent */
+    int		flags;		/* flags for contained, transparent, and
+				   combine. */
     int		keyword;	/* TRUE for ":syn keyword" */
     int		*sync_idx;	/* syntax item for "grouphere" argument, NULL
 				   if not allowed */
@@ -1861,6 +1863,7 @@
     int		cchar;
     short	*next_list;
     int		found_match;		    /* found usable match */
+    int		applied_combiner;	    /* Applied a combining syntax */
     static int	try_next_column = FALSE;    /* must try in next col */
     int		do_keywords;
     regmmatch_T	regmatch;
@@ -2284,6 +2287,8 @@
      * If not, use attributes from the current-but-one state, etc.
      */
     current_attr = 0;
+    applied_combiner = FALSE;
+
 #ifdef FEAT_EVAL
     current_id = 0;
     current_trans_id = 0;
@@ -2307,17 +2312,27 @@
 			|| (current_lnum == sip->si_h_endpos.lnum
 			    && current_col < sip->si_h_endpos.col)))
 	    {
-		current_attr = sip->si_attr;
+		if (!applied_combiner)
+		{
 #ifdef FEAT_EVAL
-		current_id = sip->si_id;
-#endif
-		current_trans_id = sip->si_trans_id;
+		    current_id = sip->si_id;
+#endif
+		    current_trans_id = sip->si_trans_id;
 #ifdef FEAT_CONCEAL
-		current_flags = sip->si_flags;
-		current_seqnr = sip->si_seqnr;
-		current_sub_char = sip->si_cchar;
-#endif
-		break;
+		    current_flags = sip->si_flags;
+		    current_seqnr = sip->si_seqnr;
+		    current_sub_char = sip->si_cchar;
+#endif
+		}
+
+		if (applied_combiner)
+		    current_attr = hl_combine_attr(sip->si_attr, current_attr);
+		else
+		    current_attr = sip->si_attr;
+		if (sip->si_flags & HL_COMBINE)
+		    applied_combiner = TRUE;
+		else
+		    break;
 	    }
 	}
 
@@ -3914,6 +3929,7 @@
 		    {HL_EXCLUDENL, "excludenl"},
 		    {HL_TRANSP, "transparent"},
 		    {HL_FOLD, "fold"},
+		    {HL_COMBINE, "combine"},
 #ifdef FEAT_CONCEAL
 		    {HL_CONCEAL, "conceal"},
 		    {HL_CONCEALENDS, "concealends"},
@@ -4467,6 +4483,7 @@
 		    {"fFoOlLdD",		0,	HL_FOLD},
 		    {"cCoOnNcCeEaAlL",		0,	HL_CONCEAL},
 		    {"cCoOnNcCeEaAlLeEnNdDsS",	0,	HL_CONCEALENDS},
+		    {"cCoOmMbBiInNeE",		0,	HL_COMBINE},
 		    {"cCcChHaArR",		11,	0},
 		    {"cCoOnNtTaAiInNsS",	1,	0},
 		    {"cCoOnNtTaAiInNeEdDiInN",	2,	0},
diff -r 538ff809ae53 src/vim.h
--- a/src/vim.h	Thu Nov 29 20:10:00 2012 +0100
+++ b/src/vim.h	Mon Dec 03 19:11:46 2012 -0800
@@ -894,6 +894,7 @@
 # define HL_TRANS_CONT	0x10000 /* transparent item without contains arg */
 # define HL_CONCEAL	0x20000 /* can be concealed */
 # define HL_CONCEALENDS	0x40000 /* can be concealed */
+# define HL_COMBINE	0x80000 /* combine attributes with other matches */
 #endif
 
 /* Values for 'options' argument in do_search() and searchit() */
