changeset 2332:b13079093ae1 vim73

Make 'cursorcolumn' work together with the conceal feature.
author Bram Moolenaar <bram@vim.org>
date Sun, 18 Jul 2010 13:55:02 +0200
parents 3840b7508835
children aee7e1e5e0ce
files src/screen.c
diffstat 1 files changed, 29 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/screen.c
+++ b/src/screen.c
@@ -2780,6 +2780,10 @@ win_line(wp, lnum, startrow, endrow, noc
     int		is_concealing	= FALSE;
     int		boguscols	= 0;	/* nonexistent columns added to force
 					   wrapping */
+    int		vcol_off = 0;		/* offset for concealed characters */
+# define VCOL_HLC (vcol - vcol_off)
+#else
+# define VCOL_HLC (vcol)
 #endif
 
     if (startrow > endrow)		/* past the end already! */
@@ -2818,7 +2822,7 @@ win_line(wp, lnum, startrow, endrow, noc
     /* 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);
+	draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
 #endif
 
 #ifdef FEAT_SPELL
@@ -4393,10 +4397,8 @@ win_line(wp, lnum, startrow, endrow, noc
 
 		    first_conceal = FALSE;
 
-# ifdef FEAT_HLCOLUMN
-		    if (hlc > 0 && n_extra > 0)
-			hlc += n_extra;
-# endif
+		    if (n_extra > 0)
+			vcol_off += n_extra;
 		    vcol += n_extra;
 		    if (wp->w_p_wrap && n_extra > 0)
 		    {
@@ -4535,7 +4537,7 @@ win_line(wp, lnum, startrow, endrow, noc
 		++prevcol;
 #endif
 
-	    /* invert at least one char, used for Visual and empty line or
+	    /* Invert at least one char, used for Visual and empty line or
 	     * highlight match at end of line. If it's beyond the last
 	     * char on the screen, just overwrite that one (tricky!)  Not
 	     * needed when a '$' was displayed for 'list'. */
@@ -4676,14 +4678,20 @@ win_line(wp, lnum, startrow, endrow, noc
 	    /* check if line ends before left margin */
 	    if (vcol < v + col - win_col_off(wp))
 		vcol = v + col - win_col_off(wp);
+#ifdef FEAT_CONCEAL
+	    /* Get rid of the boguscols now, we want to draw until the right
+	     * edge for 'cursorcolumn'. */
+	    col -= boguscols;
+	    boguscols = 0;
+#endif
 
 	    if (draw_color_col)
-		draw_color_col = advance_color_col(vcol, &color_cols);
+		draw_color_col = advance_color_col(VCOL_HLC, &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
+		      && (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off
+		      && (int)wp->w_virtcol <
+					W_WIDTH(wp) * (row - startrow + 1) + v
 		      && lnum != wp->w_cursor.lnum)
 		    || draw_color_col)
 # ifdef FEAT_RIGHTLEFT
@@ -4710,32 +4718,27 @@ win_line(wp, lnum, startrow, endrow, noc
 			ScreenLinesUC[off] = 0;
 #endif
 		    ++col;
-		    if (wp->w_p_cuc && vcol == (long)wp->w_virtcol)
+		    if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol)
 			ScreenAttrs[off++] = hl_attr(HLF_CUC);
-		    else if (draw_color_col && vcol == *color_cols)
+		    else if (draw_color_col && VCOL_HLC == *color_cols)
 			ScreenAttrs[off++] = hl_attr(HLF_MC);
 		    else
 			ScreenAttrs[off++] = 0;
 
-		    if (vcol >= rightmost_vcol)
+		    if (VCOL_HLC >= rightmost_vcol)
 			break;
 
 		    if (draw_color_col)
-			draw_color_col = advance_color_col(vcol, &color_cols);
+			draw_color_col = advance_color_col(VCOL_HLC,
+								 &color_cols);
 
 		    ++vcol;
 		}
 	    }
 #endif
 
-#ifdef FEAT_CONCEAL
-	    SCREEN_LINE(screen_row, W_WINCOL(wp), col - boguscols,
-						(int)W_WIDTH(wp), wp->w_p_rl);
-	    boguscols = 0;
-#else
 	    SCREEN_LINE(screen_row, W_WINCOL(wp), col,
 						(int)W_WIDTH(wp), wp->w_p_rl);
-#endif
 	    row++;
 
 	    /*
@@ -4788,7 +4791,7 @@ 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);
+	    draw_color_col = advance_color_col(VCOL_HLC, &color_cols);
 
 	/* Highlight the cursor column if 'cursorcolumn' is set.  But don't
 	 * highlight the cursor position itself.
@@ -4797,7 +4800,7 @@ win_line(wp, lnum, startrow, endrow, noc
 	vcol_save_attr = -1;
 	if (draw_state == WL_LINE && !lnum_in_visual_area)
 	{
-	    if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
+	    if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol
 						 && lnum != wp->w_cursor.lnum)
 	    {
 		vcol_save_attr = char_attr;
@@ -4906,17 +4909,12 @@ win_line(wp, lnum, startrow, endrow, noc
 	    }
 	}
 #ifdef FEAT_CONCEAL
-	else if (wp->w_p_conceal && is_concealing)
+	else if (wp->w_p_conceal > 0 && is_concealing)
 	{
 	    --n_skip;
-# ifdef FEAT_HLCOLUMN
-	    if (hlc)
-	    {
-		++hlc;
-		if (n_extra > 0)
-		    hlc += n_extra;
-	    }
-# endif
+	    ++vcol_off;
+	    if (n_extra > 0)
+		vcol_off += n_extra;
 	    if (wp->w_p_wrap)
 	    {
 		/*