diff src/syntax.c @ 205:d292c40ca788

updated for version 7.0060
author vimboss
date Tue, 15 Mar 2005 22:43:58 +0000
parents 4d9eabb1396e
children 7fd4b5df33be
line wrap: on
line diff
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -40,6 +40,8 @@ struct hl_group
     char_u	*sg_gui_fg_name;/* GUI foreground color name */
     guicolor_T	sg_gui_bg;	/* GUI background color handle */
     char_u	*sg_gui_bg_name;/* GUI background color name */
+    guicolor_T	sg_gui_sp;	/* GUI special color handle */
+    char_u	*sg_gui_sp_name;/* GUI special color name */
     GuiFont	sg_font;	/* GUI font handle */
 #ifdef FEAT_XFONTSET
     GuiFontset	sg_fontset;	/* GUI fontset handle */
@@ -70,9 +72,10 @@ static int include_link = FALSE;	/* incl
  * following names, separated by commas (but no spaces!).
  */
 static char *(hl_name_table[]) =
-    {"bold", "standout", "underline", "italic", "reverse", "inverse", "NONE"};
+    {"bold", "standout", "underline", "undercurl",
+				      "italic", "reverse", "inverse", "NONE"};
 static int hl_attr_table[] =
-    {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_ITALIC, HL_INVERSE, HL_INVERSE, 0};
+    {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, 0};
 
 static int get_attr_entry  __ARGS((garray_T *table, attrentry_T *aep));
 static void syn_unadd_group __ARGS((void));
@@ -1848,7 +1851,7 @@ syn_current_attr(syncing, displaying)
 	      {
 		syn_id = check_keyword_id(line, (int)current_col,
 					 &endcol, &flags, &next_list, cur_si);
-		if (syn_id)
+		if (syn_id != 0)
 		{
 		    if (push_current_state(KEYWORD_IDX) == OK)
 		    {
@@ -1893,7 +1896,7 @@ syn_current_attr(syncing, displaying)
 	    }
 
 	    /*
-	     * 3. Check for patterns (only if not found a keyword).
+	     * 3. Check for patterns (only if no keyword found).
 	     */
 	    if (syn_id == 0 && syn_buf->b_syn_patterns.ga_len)
 	    {
@@ -6758,65 +6761,86 @@ do_highlight(line, forceit, init)
 	else if (STRCMP(key, "GUIFG") == 0)
 	{
 #ifdef FEAT_GUI	    /* in non-GUI guifg colors are simply ignored */
-	  if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI))
-	  {
-	    if (!init)
-		HL_TABLE()[idx].sg_set |= SG_GUI;
-
-	    i = color_name2handle(arg);
-	    if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use)
+	    if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI))
 	    {
-		HL_TABLE()[idx].sg_gui_fg = i;
-		vim_free(HL_TABLE()[idx].sg_gui_fg_name);
-		if (STRCMP(arg, "NONE"))
-		    HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg);
-		else
-		    HL_TABLE()[idx].sg_gui_fg_name = NULL;
+		if (!init)
+		    HL_TABLE()[idx].sg_set |= SG_GUI;
+
+		i = color_name2handle(arg);
+		if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use)
+		{
+		    HL_TABLE()[idx].sg_gui_fg = i;
+		    vim_free(HL_TABLE()[idx].sg_gui_fg_name);
+		    if (STRCMP(arg, "NONE"))
+			HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg);
+		    else
+			HL_TABLE()[idx].sg_gui_fg_name = NULL;
 # ifdef FEAT_GUI_X11
-		if (is_menu_group)
-		    gui.menu_fg_pixel = i;
-		if (is_scrollbar_group)
-		    gui.scroll_fg_pixel = i;
+		    if (is_menu_group)
+			gui.menu_fg_pixel = i;
+		    if (is_scrollbar_group)
+			gui.scroll_fg_pixel = i;
 #  ifdef FEAT_BEVAL
-		if (is_tooltip_group)
-		    gui.tooltip_fg_pixel = i;
+		    if (is_tooltip_group)
+			gui.tooltip_fg_pixel = i;
 #  endif
-		do_colors = TRUE;
+		    do_colors = TRUE;
 # endif
+		}
 	    }
-	  }
 #endif
 	}
 	else if (STRCMP(key, "GUIBG") == 0)
 	{
 #ifdef FEAT_GUI	    /* in non-GUI guibg colors are simply ignored */
-	  if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI))
-	  {
-	    if (!init)
-		HL_TABLE()[idx].sg_set |= SG_GUI;
-
-	    i = color_name2handle(arg);
-	    if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use)
+	    if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI))
 	    {
-		HL_TABLE()[idx].sg_gui_bg = i;
-		vim_free(HL_TABLE()[idx].sg_gui_bg_name);
-		if (STRCMP(arg, "NONE"))
-		    HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg);
-		else
-		    HL_TABLE()[idx].sg_gui_bg_name = NULL;
+		if (!init)
+		    HL_TABLE()[idx].sg_set |= SG_GUI;
+
+		i = color_name2handle(arg);
+		if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use)
+		{
+		    HL_TABLE()[idx].sg_gui_bg = i;
+		    vim_free(HL_TABLE()[idx].sg_gui_bg_name);
+		    if (STRCMP(arg, "NONE") != 0)
+			HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg);
+		    else
+			HL_TABLE()[idx].sg_gui_bg_name = NULL;
 # ifdef FEAT_GUI_X11
-		if (is_menu_group)
-		    gui.menu_bg_pixel = i;
-		if (is_scrollbar_group)
-		    gui.scroll_bg_pixel = i;
+		    if (is_menu_group)
+			gui.menu_bg_pixel = i;
+		    if (is_scrollbar_group)
+			gui.scroll_bg_pixel = i;
 #  ifdef FEAT_BEVAL
-		if (is_tooltip_group)
-		    gui.tooltip_bg_pixel = i;
+		    if (is_tooltip_group)
+			gui.tooltip_bg_pixel = i;
 #  endif
-		do_colors = TRUE;
+		    do_colors = TRUE;
 # endif
+		}
 	    }
-	  }
+#endif
+	}
+	else if (STRCMP(key, "GUISP") == 0)
+	{
+#ifdef FEAT_GUI	    /* in non-GUI guisp colors are simply ignored */
+	    if (!init || !(HL_TABLE()[idx].sg_set & SG_GUI))
+	    {
+		if (!init)
+		    HL_TABLE()[idx].sg_set |= SG_GUI;
+
+		i = color_name2handle(arg);
+		if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use)
+		{
+		    HL_TABLE()[idx].sg_gui_sp = i;
+		    vim_free(HL_TABLE()[idx].sg_gui_sp_name);
+		    if (STRCMP(arg, "NONE") != 0)
+			HL_TABLE()[idx].sg_gui_sp_name = vim_strsave(arg);
+		    else
+			HL_TABLE()[idx].sg_gui_sp_name = NULL;
+		}
+	    }
 #endif
 	}
 	else if (STRCMP(key, "START") == 0 || STRCMP(key, "STOP") == 0)
@@ -7035,6 +7059,9 @@ highlight_clear(idx)
     HL_TABLE()[idx].sg_gui_bg = INVALCOLOR;
     vim_free(HL_TABLE()[idx].sg_gui_bg_name);
     HL_TABLE()[idx].sg_gui_bg_name = NULL;
+    HL_TABLE()[idx].sg_gui_sp = INVALCOLOR;
+    vim_free(HL_TABLE()[idx].sg_gui_sp_name);
+    HL_TABLE()[idx].sg_gui_sp_name = NULL;
     gui_mch_free_font(HL_TABLE()[idx].sg_font);
     HL_TABLE()[idx].sg_font = NOFONT;
 # ifdef FEAT_XFONTSET
@@ -7057,16 +7084,16 @@ highlight_clear(idx)
 set_normal_colors()
 {
     if (set_group_colors((char_u *)"Normal",
-			       &gui.norm_pixel, &gui.back_pixel, FALSE, TRUE,
-			       FALSE))
+			     &gui.norm_pixel, &gui.back_pixel,
+			     FALSE, TRUE, FALSE))
     {
 	gui_mch_new_colors();
 	must_redraw = CLEAR;
     }
 #ifdef FEAT_GUI_X11
     if (set_group_colors((char_u *)"Menu",
-			 &gui.menu_fg_pixel, &gui.menu_bg_pixel, TRUE, FALSE,
-			 FALSE))
+			 &gui.menu_fg_pixel, &gui.menu_bg_pixel,
+			 TRUE, FALSE, FALSE))
     {
 # ifdef FEAT_MENU
 	gui_mch_new_menu_colors();
@@ -7085,8 +7112,8 @@ set_normal_colors()
     }
 #endif
     if (set_group_colors((char_u *)"Scrollbar",
-		    &gui.scroll_fg_pixel, &gui.scroll_bg_pixel, FALSE, FALSE,
-		    FALSE))
+		    &gui.scroll_fg_pixel, &gui.scroll_bg_pixel,
+		    FALSE, FALSE, FALSE))
     {
 	gui_new_scrollbar_colors();
 	must_redraw = CLEAR;
@@ -7397,6 +7424,7 @@ get_attr_entry(table, aep)
 		       (table == &gui_attr_table
 			&& (aep->ae_u.gui.fg_color == gap->ae_u.gui.fg_color
 			    && aep->ae_u.gui.bg_color == gap->ae_u.gui.bg_color
+			    && aep->ae_u.gui.sp_color == gap->ae_u.gui.sp_color
 			    && aep->ae_u.gui.font == gap->ae_u.gui.font
 #  ifdef FEAT_XFONTSET
 			    && aep->ae_u.gui.fontset == gap->ae_u.gui.fontset
@@ -7464,6 +7492,7 @@ get_attr_entry(table, aep)
     {
 	gap->ae_u.gui.fg_color = aep->ae_u.gui.fg_color;
 	gap->ae_u.gui.bg_color = aep->ae_u.gui.bg_color;
+	gap->ae_u.gui.sp_color = aep->ae_u.gui.sp_color;
 	gap->ae_u.gui.font = aep->ae_u.gui.font;
 # ifdef FEAT_XFONTSET
 	gap->ae_u.gui.fontset = aep->ae_u.gui.fontset;
@@ -7656,21 +7685,24 @@ highlight_has_attr(id, flag, modec)
     char_u *
 highlight_color(id, what, modec)
     int		id;
-    char_u	*what;	/* "fg", "bg", "fg#" or "bg#" */
+    char_u	*what;	/* "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
     int		modec;	/* 'g' for GUI, 'c' for cterm, 't' for term */
 {
     static char_u	name[20];
     int			n;
-    int			fg;
+    int			fg = FALSE;
+# ifdef FEAT_GUI
+    int			sp = FALSE;
+# endif
 
     if (id <= 0 || id > highlight_ga.ga_len)
 	return NULL;
 
     if (TOLOWER_ASC(what[0]) == 'f')
 	fg = TRUE;
-    else
-	fg = FALSE;
-#ifdef FEAT_GUI
+# ifdef FEAT_GUI
+    else if (TOLOWER_ASC(what[0]) == 's')
+	sp = TRUE;
     if (modec == 'g')
     {
 	/* return #RRGGBB form (only possible when GUI is running) */
@@ -7682,6 +7714,8 @@ highlight_color(id, what, modec)
 
 	    if (fg)
 		color = HL_TABLE()[id - 1].sg_gui_fg;
+	    else if (sp)
+		color = HL_TABLE()[id - 1].sg_gui_sp;
 	    else
 		color = HL_TABLE()[id - 1].sg_gui_bg;
 	    if (color == INVALCOLOR)
@@ -7695,9 +7729,11 @@ highlight_color(id, what, modec)
 	}
 	if (fg)
 	    return (HL_TABLE()[id - 1].sg_gui_fg_name);
+	if (sp)
+	    return (HL_TABLE()[id - 1].sg_gui_sp_name);
 	return (HL_TABLE()[id - 1].sg_gui_bg_name);
     }
-#endif
+# endif
     if (modec == 'c')
     {
 	if (fg)
@@ -7805,6 +7841,7 @@ set_hl_attr(idx)
      */
     if (sgp->sg_gui_fg == INVALCOLOR
 	    && sgp->sg_gui_bg == INVALCOLOR
+	    && sgp->sg_gui_sp == INVALCOLOR
 	    && sgp->sg_font == NOFONT
 # ifdef FEAT_XFONTSET
 	    && sgp->sg_fontset == NOFONTSET
@@ -7818,6 +7855,7 @@ set_hl_attr(idx)
 	at_en.ae_attr = sgp->sg_gui;
 	at_en.ae_u.gui.fg_color = sgp->sg_gui_fg;
 	at_en.ae_u.gui.bg_color = sgp->sg_gui_bg;
+	at_en.ae_u.gui.sp_color = sgp->sg_gui_sp;
 	at_en.ae_u.gui.font = sgp->sg_font;
 # ifdef FEAT_XFONTSET
 	at_en.ae_u.gui.fontset = sgp->sg_fontset;
@@ -7989,6 +8027,7 @@ syn_add_group(name)
 #ifdef FEAT_GUI
     HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR;
     HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR;
+    HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR;
 #endif
     ++highlight_ga.ga_len;
 
@@ -8131,6 +8170,12 @@ gui_do_one_color(idx, do_menu, do_toolti
 			    color_name2handle(HL_TABLE()[idx].sg_gui_bg_name);
 	didit = TRUE;
     }
+    if (HL_TABLE()[idx].sg_gui_sp_name != NULL)
+    {
+	HL_TABLE()[idx].sg_gui_sp =
+			    color_name2handle(HL_TABLE()[idx].sg_gui_sp_name);
+	didit = TRUE;
+    }
     if (didit)	/* need to get a new attr number */
 	set_hl_attr(idx);
 }
@@ -8222,6 +8267,8 @@ highlight_changed()
 				break;
 		    case 'u':	attr |= HL_UNDERLINE;
 				break;
+		    case 'c':	attr |= HL_UNDERCURL;
+				break;
 		    case ':':	++p;		    /* highlight group name */
 				if (attr || *p == NUL)	 /* no combinations */
 				    return FAIL;
@@ -8320,6 +8367,8 @@ highlight_changed()
 		hlt[hlcnt + i].sg_gui_fg = hlt[id - 1].sg_gui_fg;
 	    if (hlt[id - 1].sg_gui_bg != hlt[id_S - 1].sg_gui_bg)
 		hlt[hlcnt + i].sg_gui_bg = hlt[id - 1].sg_gui_bg;
+	    if (hlt[id - 1].sg_gui_sp != hlt[id_S - 1].sg_gui_sp)
+		hlt[hlcnt + i].sg_gui_sp = hlt[id - 1].sg_gui_sp;
 	    if (hlt[id - 1].sg_font != hlt[id_S - 1].sg_font)
 		hlt[hlcnt + i].sg_font = hlt[id - 1].sg_font;
 #   ifdef FEAT_XFONTSET