diff src/screen.c @ 2314:233eb4412f5d vim73

Added 'colorcolumn' option. Partly by Gregor Uhlenheuer.
author Bram Moolenaar <bram@vim.org>
date Wed, 14 Jul 2010 19:53:30 +0200
parents 69064995302a
children b13079093ae1
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -2126,6 +2126,23 @@ win_draw_end(wp, c1, c2, row, endrow, hl
     set_empty_rows(wp, row);
 }
 
+#ifdef FEAT_SYN_HL
+static int advance_color_col __ARGS((int vcol, int **color_cols));
+
+/*
+ * Advance **color_cols and return TRUE when there are columns to draw.
+ */
+    static int
+advance_color_col(vcol, color_cols)
+    int	    vcol;
+    int	    **color_cols;
+{
+    while (**color_cols >= 0 && vcol > **color_cols)
+	++*color_cols;
+    return (**color_cols >= 0);
+}
+#endif
+
 #ifdef FEAT_FOLDING
 /*
  * Display one folded line.
@@ -2666,6 +2683,8 @@ win_line(wp, lnum, startrow, endrow, noc
     int		has_syntax = FALSE;	/* this buffer has syntax highl. */
     int		save_did_emsg;
     int		eol_hl_off = 0;		/* 1 if highlighted char after EOL */
+    int		draw_color_col = FALSE;	/* highlight colorcolumn */
+    int		*color_cols = NULL;	/* pointer to according columns array */
 #endif
 #ifdef FEAT_SPELL
     int		has_spell = FALSE;	/* this buffer has spell checking */
@@ -2795,6 +2814,11 @@ win_line(wp, lnum, startrow, endrow, noc
 	    extra_check = TRUE;
 	}
     }
+
+    /* Check for columns to display for 'colorcolumn'. */
+    color_cols = wp->w_p_cc_cols;
+    if (color_cols != NULL)
+	draw_color_col = advance_color_col(vcol, &color_cols);
 #endif
 
 #ifdef FEAT_SPELL
@@ -3073,6 +3097,7 @@ win_line(wp, lnum, startrow, endrow, noc
 #if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
 	/* When:
 	 * - 'cuc' is set, or
+	 * - 'colorcolumn' is set, or
 	 * - 'virtualedit' is set, or
 	 * - the visual mode is active,
 	 * the end of the line may be before the start of the displayed part.
@@ -3080,6 +3105,7 @@ win_line(wp, lnum, startrow, endrow, noc
 	if (vcol < v && (
 # ifdef FEAT_SYN_HL
 	     wp->w_p_cuc
+	     || draw_color_col
 #  if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
 	     ||
 #  endif
@@ -4641,25 +4667,41 @@ win_line(wp, lnum, startrow, endrow, noc
 		--vcol;
 	    }
 
-	    /* Highlight 'cursorcolumn' past end of the line. */
+	    /* Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. */
 	    if (wp->w_p_wrap)
 		v = wp->w_skipcol;
 	    else
 		v = wp->w_leftcol;
+
 	    /* check if line ends before left margin */
 	    if (vcol < v + col - win_col_off(wp))
-
 		vcol = v + col - win_col_off(wp);
-	    if (wp->w_p_cuc
-		    && (int)wp->w_virtcol >= vcol - eol_hl_off
-		    && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1)
+
+	    if (draw_color_col)
+		draw_color_col = advance_color_col(vcol, &color_cols);
+
+	    if (((wp->w_p_cuc
+		      && (int)wp->w_virtcol >= vcol - eol_hl_off
+		      && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1)
 									   + v
-		    && lnum != wp->w_cursor.lnum
+		      && lnum != wp->w_cursor.lnum)
+		    || draw_color_col)
 # ifdef FEAT_RIGHTLEFT
 		    && !wp->w_p_rl
 # endif
 		    )
 	    {
+		int	rightmost_vcol = 0;
+		int	i;
+
+		if (wp->w_p_cuc)
+		    rightmost_vcol = wp->w_virtcol;
+		if (draw_color_col)
+		    /* determine rightmost colorcolumn to possibly draw */
+		    for (i = 0; color_cols[i] >= 0; ++i)
+			if (rightmost_vcol < color_cols[i])
+			    rightmost_vcol = color_cols[i];
+
 		while (col < W_WIDTH(wp))
 		{
 		    ScreenLines[off] = ' ';
@@ -4668,12 +4710,19 @@ win_line(wp, lnum, startrow, endrow, noc
 			ScreenLinesUC[off] = 0;
 #endif
 		    ++col;
-		    if (vcol == (long)wp->w_virtcol)
-		    {
-			ScreenAttrs[off] = hl_attr(HLF_CUC);
+		    if (wp->w_p_cuc && vcol == (long)wp->w_virtcol)
+			ScreenAttrs[off++] = hl_attr(HLF_CUC);
+		    else if (draw_color_col && vcol == *color_cols)
+			ScreenAttrs[off++] = hl_attr(HLF_MC);
+		    else
+			ScreenAttrs[off++] = 0;
+
+		    if (vcol >= rightmost_vcol)
 			break;
-		    }
-		    ScreenAttrs[off++] = 0;
+
+		    if (draw_color_col)
+			draw_color_col = advance_color_col(vcol, &color_cols);
+
 		    ++vcol;
 		}
 	    }
@@ -4737,18 +4786,29 @@ win_line(wp, lnum, startrow, endrow, noc
 	}
 
 #ifdef FEAT_SYN_HL
+	/* advance to the next 'colorcolumn' */
+	if (draw_color_col)
+	    draw_color_col = advance_color_col(vcol, &color_cols);
+
 	/* Highlight the cursor column if 'cursorcolumn' is set.  But don't
-	 * highlight the cursor position itself. */
-	if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
-		&& lnum != wp->w_cursor.lnum
-		&& draw_state == WL_LINE
-		&& !lnum_in_visual_area)
-	{
-	    vcol_save_attr = char_attr;
-	    char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
-	}
-	else
-	    vcol_save_attr = -1;
+	 * highlight the cursor position itself.
+	 * Also highlight the 'colorcolumn' if it is different than
+	 * 'cursorcolumn' */
+	vcol_save_attr = -1;
+	if (draw_state == WL_LINE && !lnum_in_visual_area)
+	{
+	    if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
+						 && lnum != wp->w_cursor.lnum)
+	    {
+		vcol_save_attr = char_attr;
+		char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
+	    }
+	    else if (draw_color_col && vcol == *color_cols)
+	    {
+		vcol_save_attr = char_attr;
+		char_attr = hl_combine_attr(char_attr, hl_attr(HLF_MC));
+	    }
+	}
 #endif
 
 	/*