Mercurial > vim
diff src/screen.c @ 16135:dc0801e374e0 v8.1.1072
patch 8.1.1072: extending sign and foldcolumn below the text is confusing
commit https://github.com/vim/vim/commit/8ee4c01b8c79a29065c1af05e5d9c0721069765f
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Mar 29 18:08:18 2019 +0100
patch 8.1.1072: extending sign and foldcolumn below the text is confusing
Problem: Extending sign and foldcolumn below the text is confusing.
Solution: Let the sign and foldcolumn stop at the last text line, just like
the line number column. Also stop the command line window leader.
(Christian Brabandt, closes #3964)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 29 Mar 2019 18:15:05 +0100 |
parents | 78faa25f9698 |
children | 5a2033905f19 |
line wrap: on
line diff
--- a/src/screen.c +++ b/src/screen.c @@ -123,7 +123,7 @@ static schar_T *current_ScreenLine; static void win_update(win_T *wp); static void win_redr_status(win_T *wp, int ignore_pum); -static void win_draw_end(win_T *wp, int c1, int c2, int row, int endrow, hlf_T hl); +static void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl); #ifdef FEAT_FOLDING static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T lnum, int row); static void fill_foldcolumn(char_u *p, win_T *wp, int closed, linenr_T lnum); @@ -2217,7 +2217,7 @@ win_update(win_T *wp) } else { - win_draw_end(wp, '@', ' ', srow, wp->w_height, HLF_AT); + win_draw_end(wp, '@', ' ', TRUE, srow, wp->w_height, HLF_AT); wp->w_botline = lnum; } } @@ -2231,16 +2231,14 @@ win_update(win_T *wp) j = diff_check_fill(wp, wp->w_botline); if (j > 0 && !wp->w_botfill) { - /* - * Display filler lines at the end of the file - */ + // Display filler lines at the end of the file. if (char2cells(fill_diff) > 1) i = '-'; else i = fill_diff; if (row + j > wp->w_height) j = wp->w_height - row; - win_draw_end(wp, i, i, row, row + (int)j, HLF_DED); + win_draw_end(wp, i, i, TRUE, row, row + (int)j, HLF_DED); row += j; } #endif @@ -2248,9 +2246,9 @@ win_update(win_T *wp) else if (dollar_vcol == -1) wp->w_botline = lnum; - /* make sure the rest of the screen is blank */ - /* put '~'s on rows that aren't part of the file. */ - win_draw_end(wp, '~', ' ', row, wp->w_height, HLF_EOB); + // Make sure the rest of the screen is blank + // put '~'s on rows that aren't part of the file. + win_draw_end(wp, '~', ' ', FALSE, row, wp->w_height, HLF_EOB); } #ifdef SYN_TIME_LIMIT @@ -2305,113 +2303,97 @@ win_update(win_T *wp) } /* - * Clear the rest of the window and mark the unused lines with "c1". use "c2" - * as the filler character. + * Call screen_fill() with the columns adjusted for 'rightleft' if needed. + * Return the new offset. + */ + static int +screen_fill_end( + win_T *wp, + int c1, + int c2, + int off, + int width, + int row, + int endrow, + int attr) +{ + int nn = off + width; + + if (nn > wp->w_width) + nn = wp->w_width; +#ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { + screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, + W_ENDCOL(wp) - nn, (int)W_ENDCOL(wp) - off, + c1, c2, attr); + } + else +#endif + screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, + wp->w_wincol + off, (int)wp->w_wincol + nn, + c1, c2, attr); + return nn; +} + +/* + * Clear lines near the end the window and mark the unused lines with "c1". + * use "c2" as the filler character. + * When "draw_margin" is TRUE then draw the sign, fold and number columns. */ static void win_draw_end( win_T *wp, int c1, int c2, + int draw_margin, int row, int endrow, hlf_T hl) { -#if defined(FEAT_FOLDING) || defined(FEAT_SIGNS) || defined(FEAT_CMDWIN) int n = 0; -# define FDC_OFF n -#else -# define FDC_OFF 0 -#endif + + if (draw_margin) + { #ifdef FEAT_FOLDING - int fdc = compute_foldcolumn(wp, 0); -#endif + int fdc = compute_foldcolumn(wp, 0); + + if (fdc > 0) + // draw the fold column + n = screen_fill_end(wp, ' ', ' ', n, fdc, + row, endrow, HL_ATTR(HLF_FC)); +#endif +#ifdef FEAT_SIGNS + if (signcolumn_on(wp)) + // draw the sign column + n = screen_fill_end(wp, ' ', ' ', n, 2, + row, endrow, HL_ATTR(HLF_SC)); +#endif + if ((wp->w_p_nu || wp->w_p_rnu) + && vim_strchr(p_cpo, CPO_NUMCOL) == NULL) + // draw the number column + n = screen_fill_end(wp, ' ', ' ', n, number_width(wp) + 1, + row, endrow, HL_ATTR(HLF_N)); + } #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { - /* No check for cmdline window: should never be right-left. */ -# ifdef FEAT_FOLDING - n = fdc; - - if (n > 0) - { - /* draw the fold column at the right */ - if (n > wp->w_width) - n = wp->w_width; - screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - W_ENDCOL(wp) - n, (int)W_ENDCOL(wp), - ' ', ' ', HL_ATTR(HLF_FC)); - } -# endif -# ifdef FEAT_SIGNS - if (signcolumn_on(wp)) - { - int nn = n + 2; - - /* draw the sign column left of the fold column */ - if (nn > wp->w_width) - nn = wp->w_width; - screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - W_ENDCOL(wp) - nn, (int)W_ENDCOL(wp) - n, - ' ', ' ', HL_ATTR(HLF_SC)); - n = nn; - } -# endif screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - wp->w_wincol, W_ENDCOL(wp) - 1 - FDC_OFF, + wp->w_wincol, W_ENDCOL(wp) - 1 - n, c2, c2, HL_ATTR(hl)); screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - W_ENDCOL(wp) - 1 - FDC_OFF, W_ENDCOL(wp) - FDC_OFF, + W_ENDCOL(wp) - 1 - n, W_ENDCOL(wp) - n, c1, c2, HL_ATTR(hl)); } else #endif { -#ifdef FEAT_CMDWIN - if (cmdwin_type != 0 && wp == curwin) - { - /* draw the cmdline character in the leftmost column */ - n = 1; - if (n > wp->w_width) - n = wp->w_width; - screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - wp->w_wincol, (int)wp->w_wincol + n, - cmdwin_type, ' ', HL_ATTR(HLF_AT)); - } -#endif -#ifdef FEAT_FOLDING - if (fdc > 0) - { - int nn = n + fdc; - - /* draw the fold column at the left */ - if (nn > wp->w_width) - nn = wp->w_width; - screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - wp->w_wincol + n, (int)wp->w_wincol + nn, - ' ', ' ', HL_ATTR(HLF_FC)); - n = nn; - } -#endif -#ifdef FEAT_SIGNS - if (signcolumn_on(wp)) - { - int nn = n + 2; - - /* draw the sign column after the fold column */ - if (nn > wp->w_width) - nn = wp->w_width; - screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - wp->w_wincol + n, (int)wp->w_wincol + nn, - ' ', ' ', HL_ATTR(HLF_SC)); - n = nn; - } -#endif screen_fill(W_WINROW(wp) + row, W_WINROW(wp) + endrow, - wp->w_wincol + FDC_OFF, (int)W_ENDCOL(wp), + wp->w_wincol + n, (int)W_ENDCOL(wp), c1, c2, HL_ATTR(hl)); } + set_empty_rows(wp, row); } @@ -5885,7 +5867,7 @@ win_line( #endif ) { - win_draw_end(wp, '@', ' ', row, wp->w_height, HLF_AT); + win_draw_end(wp, '@', ' ', TRUE, row, wp->w_height, HLF_AT); draw_vsep_win(wp, row); row = endrow; }