diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-07-14 19:53:30 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-07-14 19:53:30 +0200 |
commit | 1a38442dbc01e511c29e19faa2ee9a8527151887 (patch) | |
tree | 1aacc128778656b1a778326ee63cf2d28f7f3072 /src/screen.c | |
parent | b28ebbca8400dccfc5eb9957ed96fcba9fe05e46 (diff) | |
download | vim-1a38442dbc01e511c29e19faa2ee9a8527151887.zip |
Added 'colorcolumn' option. Partly by Gregor Uhlenheuer.
Diffstat (limited to 'src/screen.c')
-rw-r--r-- | src/screen.c | 100 |
1 files changed, 80 insertions, 20 deletions
diff --git a/src/screen.c b/src/screen.c index 3df7f665d..0a2b9a941 100644 --- 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, nochange) 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, nochange) 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, nochange) #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, nochange) 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, nochange) --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, nochange) 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, nochange) } #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) + * 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) { - vcol_save_attr = char_attr; - char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC)); + 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)); + } } - else - vcol_save_attr = -1; #endif /* |