diff options
Diffstat (limited to 'src/nvim/screen.c')
-rw-r--r-- | src/nvim/screen.c | 104 |
1 files changed, 60 insertions, 44 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 122c23ed84..c46b5fa48c 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -346,7 +346,7 @@ int redraw_asap(int type) * Note that when also inserting/deleting lines w_redraw_top and w_redraw_bot * may become invalid and the whole window will have to be redrawn. */ -void +void redrawWinline ( linenr_T lnum, int invalid /* window line height is invalid now */ @@ -2114,7 +2114,7 @@ static void copy_text_attr(int off, char_u *buf, int len, int attr) * Fill the foldcolumn at "p" for window "wp". * Only to be called when 'foldcolumn' > 0. */ -static void +static void fill_foldcolumn ( char_u *p, win_T *wp, @@ -2166,7 +2166,7 @@ fill_foldcolumn ( * * Return the number of last row the line occupies. */ -static int +static int win_line ( win_T *wp, linenr_T lnum, @@ -2655,8 +2655,8 @@ win_line ( } next_search_hl(wp, shl, lnum, (colnr_T)v, cur); - // Need to get the line again, a multi-line regexp may have made it - // invalid. + // Need to get the line again, a multi-line regexp may have made it + // invalid. line = ml_get_buf(wp->w_buffer, lnum, false); ptr = line + v; @@ -2672,7 +2672,7 @@ win_line ( } else { shl->endcol = MAXCOL; } - // Highlight one character for an empty match. + // Highlight one character for an empty match. if (shl->startcol == shl->endcol) { if (has_mbyte && line[shl->endcol] != NUL) { shl->endcol += (*mb_ptr2len)(line + shl->endcol); @@ -2680,7 +2680,7 @@ win_line ( ++shl->endcol; } } - if ((long)shl->startcol < v) { // match at leftcol + if ((long)shl->startcol < v) { // match at leftcol shl->attr_cur = shl->attr; search_attr = shl->attr; } @@ -2830,9 +2830,12 @@ win_line ( if (wp->w_p_bri && n_extra == 0 && row != startrow && filler_lines == 0) { char_attr = 0; // was: hl_attr(HLF_AT); - if (diff_hlf != (hlf_T)0) + if (diff_hlf != (hlf_T)0) { char_attr = hl_attr(diff_hlf); - + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { + char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); + } + } p_extra = NULL; c_extra = ' '; n_extra = get_breakindent_win(wp, ml_get_buf(wp->w_buffer, lnum, FALSE)); @@ -2869,8 +2872,9 @@ win_line ( if (tocol == vcol) tocol += n_extra; /* combine 'showbreak' with 'cursorline' */ - if (wp->w_p_cul && lnum == wp->w_cursor.lnum) - char_attr = hl_combine_attr(char_attr, HLF_CLN); + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { + char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); + } } } @@ -2948,7 +2952,7 @@ win_line ( && v >= (long)shl->startcol && v < (long)shl->endcol) { shl->attr_cur = shl->attr; - } else if (v >= (long)shl->endcol) { + } else if (v >= (long)shl->endcol && shl->lnum == lnum) { shl->attr_cur = 0; next_search_hl(wp, shl, lnum, (colnr_T)v, cur); @@ -3016,6 +3020,9 @@ win_line ( && n_extra == 0) diff_hlf = HLF_CHD; /* changed line */ line_attr = hl_attr(diff_hlf); + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { + line_attr = hl_combine_attr(line_attr, hl_attr(HLF_CUL)); + } } /* Decide which of the highlight attributes to use. */ @@ -3620,8 +3627,12 @@ win_line ( char_attr = line_attr; if (diff_hlf == HLF_TXD) { diff_hlf = HLF_CHD; - if (attr == 0 || char_attr != attr) + if (attr == 0 || char_attr != attr) { char_attr = hl_attr(diff_hlf); + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) { + char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL)); + } + } } } } @@ -4676,7 +4687,7 @@ static int skip_status_match_char(expand_T *xp, char_u *s) * * If inversion is possible we use it. Else '=' characters are used. */ -void +void win_redr_status_matches ( expand_T *xp, int num_matches, @@ -4962,7 +4973,7 @@ void win_redr_status(win_T *wp) fillchar = fillchar_status(&attr, wp == curwin); else fillchar = fillchar_vsep(&attr); - screen_putchar(fillchar, wp->w_winrow + wp->w_height, + screen_putchar(fillchar, wp->w_winrow + wp->w_height, W_ENDCOL(wp), attr); } busy = FALSE; @@ -5024,7 +5035,7 @@ int stl_connected(win_T *wp) /* * Get the value to show for the language mappings, active 'keymap'. */ -int +int get_keymap_str ( win_T *wp, char_u *buf, /* buffer for the result */ @@ -5068,7 +5079,7 @@ get_keymap_str ( * Redraw the status line or ruler of window "wp". * When "wp" is NULL redraw the tab pages line from 'tabline'. */ -static void +static void win_redr_custom ( win_T *wp, int draw_ruler /* TRUE or FALSE */ @@ -5606,7 +5617,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum) if (cur != NULL) { cur->pos.cur = 0; } - bool pos_inprogress = true; // mark that a position match search is + bool pos_inprogress = true; // mark that a position match search is // in progress n = 0; while (shl->first_lnum < lnum && (shl->rm.regprog != NULL @@ -5637,7 +5648,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum) * shl->lnum is zero. * Careful: Any pointers for buffer lines will become invalid. */ -static void +static void next_search_hl ( win_T *win, match_T *shl, /* points to search_hl or a match */ @@ -5705,9 +5716,9 @@ next_search_hl ( if (shl->rm.regprog != NULL) { nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol, &(shl->tm)); if (called_emsg || got_int) { - // Error while handling regexp: stop using this regexp. + // Error while handling regexp: stop using this regexp. if (shl == &search_hl) { - // don't free regprog in the match list, it's a copy + // don't free regprog in the match list, it's a copy vim_regfree(shl->rm.regprog); SET_NO_HLSEARCH(TRUE); } @@ -5735,11 +5746,11 @@ next_search_hl ( static int next_search_hl_pos( - match_T *shl, // points to a match + match_T *shl, // points to a match linenr_T lnum, - posmatch_T *posmatch, // match positions + posmatch_T *posmatch, // match positions colnr_T mincol // minimal column for a match -) +) { int i; int bot = -1; @@ -5754,8 +5765,8 @@ next_search_hl_pos( } if (posmatch->pos[i].lnum == lnum) { if (shl->lnum == lnum) { - // partially sort positions by column numbers - // on the same line + // partially sort positions by column numbers + // on the same line if (posmatch->pos[i].col < posmatch->pos[bot].col) { llpos_T tmp = posmatch->pos[i]; @@ -5772,7 +5783,7 @@ next_search_hl_pos( if (shl->lnum == lnum) { colnr_T start = posmatch->pos[bot].col == 0 ? 0: posmatch->pos[bot].col - 1; - colnr_T end = posmatch->pos[bot].col == 0 + colnr_T end = posmatch->pos[bot].col == 0 ? MAXCOL : start + posmatch->pos[bot].len; shl->rm.startpos[0].lnum = 0; @@ -6263,7 +6274,6 @@ int screen_valid(int doclear) void screenalloc(bool doclear) { int new_row, old_row; - win_T *wp; int outofmem = FALSE; int len; schar_T *new_ScreenLines; @@ -6275,7 +6285,6 @@ void screenalloc(bool doclear) unsigned *new_LineOffset; char_u *new_LineWraps; short *new_TabPageIdxs; - tabpage_T *tp; static int entered = FALSE; /* avoid recursiveness */ static int done_outofmem_msg = FALSE; /* did outofmem message */ int retry_count = 0; @@ -6328,8 +6337,9 @@ retry: * Continuing with the old ScreenLines may result in a crash, because the * size is wrong. */ - FOR_ALL_TAB_WINDOWS(tp, wp) - win_free_lsize(wp); + FOR_ALL_TAB_WINDOWS(tp, wp) { + win_free_lsize(wp); + } if (aucmd_win != NULL) win_free_lsize(aucmd_win); @@ -6349,8 +6359,7 @@ retry: new_LineWraps = xmalloc((size_t)(Rows * sizeof(char_u))); new_TabPageIdxs = xmalloc((size_t)(Columns * sizeof(short))); - FOR_ALL_TAB_WINDOWS(tp, wp) - { + FOR_ALL_TAB_WINDOWS(tp, wp) { win_alloc_lines(wp); } if (aucmd_win != NULL && aucmd_win->w_lines == NULL) { @@ -7093,7 +7102,7 @@ static void win_rest_invalid(win_T *wp) * * return FAIL for failure, OK for success. */ -int +int screen_ins_lines ( int off, int row, @@ -7266,7 +7275,7 @@ screen_ins_lines ( * * Return OK for success, FAIL if the lines are not deleted. */ -int +int screen_del_lines ( int off, int row, @@ -7632,8 +7641,7 @@ void unshowmode(int force) static void draw_tabline(void) { int tabcount = 0; - tabpage_T *tp; - int tabwidth; + int tabwidth = 0; int col = 0; int scol = 0; int attr; @@ -7675,18 +7683,27 @@ static void draw_tabline(void) (char_u *)"", OPT_FREE, SID_ERROR); called_emsg |= save_called_emsg; } else { - for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) + FOR_ALL_TABS(tp) { ++tabcount; + } - tabwidth = (Columns - 1 + tabcount / 2) / tabcount; - if (tabwidth < 6) + if (tabcount > 0) { + tabwidth = (Columns - 1 + tabcount / 2) / tabcount; + } + + if (tabwidth < 6) { tabwidth = 6; + } attr = attr_nosel; tabcount = 0; scol = 0; - for (tp = first_tabpage; tp != NULL && col < Columns - 4; - tp = tp->tp_next) { + + FOR_ALL_TABS(tp) { + if (col >= Columns - 4) { + break; + } + scol = col; if (tp->tp_topframe == topframe) @@ -7718,8 +7735,7 @@ static void draw_tabline(void) if (col + len >= Columns - 3) break; screen_puts_len(NameBuff, len, 0, col, - hl_combine_attr(attr, hl_attr(HLF_T)) - ); + hl_combine_attr(attr, hl_attr(HLF_T))); col += len; } if (modified) |