diff options
Diffstat (limited to 'src/nvim/plines.c')
-rw-r--r-- | src/nvim/plines.c | 142 |
1 files changed, 72 insertions, 70 deletions
diff --git a/src/nvim/plines.c b/src/nvim/plines.c index d63c032080..c59c23179e 100644 --- a/src/nvim/plines.c +++ b/src/nvim/plines.c @@ -59,12 +59,12 @@ int win_chartabsize(win_T *wp, char *p, colnr_T col) /// @return Number of characters the string will take on the screen. int linetabsize_col(int startvcol, char *s) { - CharsizeArg arg; - CSType const cstype = init_charsize_arg(&arg, curwin, 0, s); + CharsizeArg csarg; + CSType const cstype = init_charsize_arg(&csarg, curwin, 0, s); if (cstype == kCharsizeFast) { - return linesize_fast(&arg, startvcol, MAXCOL); + return linesize_fast(&csarg, startvcol, MAXCOL); } else { - return linesize_regular(&arg, startvcol, MAXCOL); + return linesize_regular(&csarg, startvcol, MAXCOL); } } @@ -79,26 +79,26 @@ int linetabsize(win_T *wp, linenr_T lnum) /// /// "line" is the start of the line. /// When "lnum" is zero do not use inline virtual text. -CSType init_charsize_arg(CharsizeArg *cts, win_T *wp, linenr_T lnum, char *line) +CSType init_charsize_arg(CharsizeArg *csarg, win_T *wp, linenr_T lnum, char *line) { - cts->win = wp; - cts->line = line; - cts->max_head_vcol = 0; - cts->cur_text_width_left = 0; - cts->cur_text_width_right = 0; - cts->virt_row = -1; - cts->indent_width = INT_MIN; - cts->use_tabstop = !wp->w_p_list || wp->w_p_lcs_chars.tab1; + csarg->win = wp; + csarg->line = line; + csarg->max_head_vcol = 0; + csarg->cur_text_width_left = 0; + csarg->cur_text_width_right = 0; + csarg->virt_row = -1; + csarg->indent_width = INT_MIN; + csarg->use_tabstop = !wp->w_p_list || wp->w_p_lcs_chars.tab1; if (lnum > 0 && wp->w_buffer->b_virt_text_inline > 0) { - marktree_itr_get(wp->w_buffer->b_marktree, lnum - 1, 0, cts->iter); - MTKey mark = marktree_itr_current(cts->iter); + marktree_itr_get(wp->w_buffer->b_marktree, lnum - 1, 0, csarg->iter); + MTKey mark = marktree_itr_current(csarg->iter); if (mark.pos.row == lnum - 1) { - cts->virt_row = lnum - 1; + csarg->virt_row = lnum - 1; } } - if (cts->virt_row >= 0 + if (csarg->virt_row >= 0 || (wp->w_p_wrap && (wp->w_p_lbr || wp->w_p_bri || *get_showbreak_value(wp) != NUL))) { return kCharsizeRegular; } else { @@ -115,16 +115,16 @@ CSType init_charsize_arg(CharsizeArg *cts, win_T *wp, linenr_T lnum, char *line) /// of 'showbreak'/'breakindent' before "cts->max_head_vcol". /// When "cts->max_head_vcol" is negative, only count in "head" the size /// of 'showbreak'/'breakindent' before where cursor should be placed. -CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, +CharSize charsize_regular(CharsizeArg *csarg, char *const cur, colnr_T const vcol, int32_t const cur_char) { - cts->cur_text_width_left = 0; - cts->cur_text_width_right = 0; + csarg->cur_text_width_left = 0; + csarg->cur_text_width_right = 0; - win_T *wp = cts->win; + win_T *wp = csarg->win; buf_T *buf = wp->w_buffer; - char *line = cts->line; - bool const use_tabstop = cur_char == TAB && cts->use_tabstop; + char *line = csarg->line; + bool const use_tabstop = cur_char == TAB && csarg->use_tabstop; int mb_added = 0; bool has_lcs_eol = wp->w_p_list && wp->w_p_lcs_chars.eol != NUL; @@ -143,12 +143,12 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, is_doublewidth = size == 2 && cur_char > 0x80; } - if (cts->virt_row >= 0) { + if (csarg->virt_row >= 0) { int tab_size = size; int col = (int)(cur - line); while (true) { - MTKey mark = marktree_itr_current(cts->iter); - if (mark.pos.row != cts->virt_row || mark.pos.col > col) { + MTKey mark = marktree_itr_current(csarg->iter); + if (mark.pos.row != csarg->virt_row || mark.pos.col > col) { break; } else if (mark.pos.col == col) { if (!mt_end(mark) && mark.flags & (MT_FLAG_DECOR_VIRT_TEXT_INLINE)) { @@ -157,9 +157,9 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, while (vt) { if (!(vt->flags & kVTIsLines) && vt->pos == kVPosInline) { if (mt_right(mark)) { - cts->cur_text_width_right += vt->width; + csarg->cur_text_width_right += vt->width; } else { - cts->cur_text_width_left += vt->width; + csarg->cur_text_width_left += vt->width; } size += vt->width; if (use_tabstop) { @@ -173,7 +173,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, } } } - marktree_itr_next(wp->w_buffer->b_marktree, cts->iter); + marktree_itr_next(wp->w_buffer->b_marktree, csarg->iter); } } @@ -193,7 +193,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, int col_off_prev = win_col_off(wp); int width2 = wp->w_width_inner - col_off_prev + win_col_off2(wp); colnr_T wcol = vcol + col_off_prev; - colnr_T max_head_vcol = cts->max_head_vcol; + colnr_T max_head_vcol = csarg->max_head_vcol; int added = 0; // cells taken by 'showbreak'/'breakindent' before current char @@ -204,7 +204,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, if (wcol >= width2 && width2 > 0) { wcol %= width2; } - head_prev = cts->indent_width; + head_prev = csarg->indent_width; if (head_prev == INT_MIN) { head_prev = 0; if (*sbr != NUL) { @@ -213,7 +213,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, if (wp->w_p_bri) { head_prev += get_breakindent_win(wp, line); } - cts->indent_width = head_prev; + csarg->indent_width = head_prev; } if (wcol < head_prev) { head_prev -= wcol; @@ -230,7 +230,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, if (wcol + size > wp->w_width) { // cells taken by 'showbreak'/'breakindent' halfway current char - int head_mid = cts->indent_width; + int head_mid = csarg->indent_width; if (head_mid == INT_MIN) { head_mid = 0; if (*sbr != NUL) { @@ -239,7 +239,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, if (wp->w_p_bri) { head_mid += get_breakindent_win(wp, line); } - cts->indent_width = head_mid; + csarg->indent_width = head_mid; } if (head_mid > 0 && wcol + size > wp->w_width_inner) { // Calculate effective window width. @@ -259,7 +259,7 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, head += (max_head_vcol - (vcol + head_prev + prev_rem) + width2 - 1) / width2 * head_mid; } else if (max_head_vcol < 0) { - int off = virt_text_cursor_off(cts, *cur == NUL); + int off = virt_text_cursor_off(csarg, *cur == NUL); if (off >= prev_rem) { if (size > off) { head += (1 + (off - prev_rem) / width) * head_mid; @@ -279,11 +279,11 @@ CharSize charsize_regular(CharsizeArg *cts, char *const cur, colnr_T const vcol, // If 'linebreak' set check at a blank before a non-blank if the line // needs a break here if (wp->w_p_lbr && wp->w_p_wrap && wp->w_width_inner != 0) { - char *t = cts->line; + char *t = csarg->line; while (vim_isbreak((uint8_t)t[0])) { t++; } - vcol_start = (colnr_T)(t - cts->line); + vcol_start = (colnr_T)(t - csarg->line); } if (wp->w_p_lbr && vcol_start <= vcol && vim_isbreak((uint8_t)s[0]) @@ -361,10 +361,10 @@ static inline CharSize charsize_fast_impl(win_T *const wp, bool use_tabstop, col /// Like charsize_regular(), except it doesn't handle virtual text, /// linebreak, breakindent and showbreak. Handles normal characters, tabs and wrapping. /// Can be used if CSType is kCharsizeFast. -CharSize charsize_fast(CharsizeArg *cts, colnr_T const vcol, int32_t const cur_char) +CharSize charsize_fast(CharsizeArg *csarg, colnr_T const vcol, int32_t const cur_char) FUNC_ATTR_PURE { - return charsize_fast_impl(cts->win, cts->use_tabstop, vcol, cur_char); + return charsize_fast_impl(csarg->win, csarg->use_tabstop, vcol, cur_char); } /// Check that virtual column "vcol" is in the rightmost column of window "wp". @@ -403,20 +403,20 @@ static bool in_win_border(win_T *wp, colnr_T vcol) /// /// @return virtual column before the character at 'len', /// or full size of the line if 'len' is MAXCOL. -int linesize_regular(CharsizeArg *const arg, int vcol, colnr_T const len) +int linesize_regular(CharsizeArg *const csarg, int vcol, colnr_T const len) { - char *const line = arg->line; + char *const line = csarg->line; StrCharInfo ci = utf_ptr2StrCharInfo(line); while (ci.ptr - line < len && *ci.ptr != NUL) { - vcol += charsize_regular(arg, ci.ptr, vcol, ci.chr.value).width; + vcol += charsize_regular(csarg, ci.ptr, vcol, ci.chr.value).width; ci = utfc_next(ci); } // Check for inline virtual text after the end of the line. - if (len == MAXCOL && arg->virt_row >= 0) { - (void)charsize_regular(arg, ci.ptr, vcol, ci.chr.value); - vcol += arg->cur_text_width_left + arg->cur_text_width_right; + if (len == MAXCOL && csarg->virt_row >= 0) { + (void)charsize_regular(csarg, ci.ptr, vcol, ci.chr.value); + vcol += csarg->cur_text_width_left + csarg->cur_text_width_right; } return vcol; @@ -425,12 +425,12 @@ int linesize_regular(CharsizeArg *const arg, int vcol, colnr_T const len) /// Like win_linesize_regular, but can be used when CStype is kCharsizeFast. /// /// @see win_linesize_regular -int linesize_fast(CharsizeArg const *const arg, int vcol, colnr_T const len) +int linesize_fast(CharsizeArg const *const csarg, int vcol, colnr_T const len) { - win_T *const wp = arg->win; - bool const use_tabstop = arg->use_tabstop; + win_T *const wp = csarg->win; + bool const use_tabstop = csarg->use_tabstop; - char *const line = arg->line; + char *const line = csarg->line; StrCharInfo ci = utf_ptr2StrCharInfo(line); while (ci.ptr - line < len && *ci.ptr != NUL) { @@ -443,15 +443,17 @@ int linesize_fast(CharsizeArg const *const arg, int vcol, colnr_T const len) /// Get how many virtual columns inline virtual text should offset the cursor. /// +/// @param csarg should contain information stored by charsize_regular() +/// about widths of left and right gravity virtual text /// @param on_NUL whether this is the end of the line -static int virt_text_cursor_off(CharsizeArg *cts, bool on_NUL) +static int virt_text_cursor_off(const CharsizeArg *csarg, bool on_NUL) { int off = 0; if (!on_NUL || !(State & MODE_NORMAL)) { - off += cts->cur_text_width_left; + off += csarg->cur_text_width_left; } if (!on_NUL && (State & MODE_NORMAL)) { - off += cts->cur_text_width_right; + off += csarg->cur_text_width_right; } return off; } @@ -473,16 +475,16 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *en char *const line = ml_get_buf(wp->w_buffer, pos->lnum); // start of the line int const end_col = pos->col; - CharsizeArg arg; + CharsizeArg csarg; bool on_NUL = false; - CSType const cstype = init_charsize_arg(&arg, wp, pos->lnum, line); - arg.max_head_vcol = -1; + CSType const cstype = init_charsize_arg(&csarg, wp, pos->lnum, line); + csarg.max_head_vcol = -1; colnr_T vcol = 0; CharSize char_size; StrCharInfo ci = utf_ptr2StrCharInfo(line); if (cstype == kCharsizeFast) { - bool const use_tabstop = arg.use_tabstop; + bool const use_tabstop = csarg.use_tabstop; while (true) { if (*ci.ptr == NUL) { // if cursor is at NUL, it is treated like 1 cell char @@ -499,10 +501,10 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *en } } else { while (true) { - char_size = charsize_regular(&arg, ci.ptr, vcol, ci.chr.value); + char_size = charsize_regular(&csarg, ci.ptr, vcol, ci.chr.value); if (*ci.ptr == NUL) { // if cursor is at NUL, it is treated like 1 cell char unless there is virtual text - char_size.width = MAX(1, arg.cur_text_width_left + arg.cur_text_width_right); + char_size.width = MAX(1, csarg.cur_text_width_left + csarg.cur_text_width_right); on_NUL = true; break; } @@ -535,7 +537,7 @@ void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *en // cursor at end *cursor = vcol + incr - 1; } else { - vcol += virt_text_cursor_off(&arg, on_NUL); + vcol += virt_text_cursor_off(&csarg, on_NUL); // cursor at start *cursor = vcol + head; } @@ -724,17 +726,17 @@ int plines_win_nofill(win_T *wp, linenr_T lnum, bool limit_winheight) int plines_win_nofold(win_T *wp, linenr_T lnum) { char *s = ml_get_buf(wp->w_buffer, lnum); - CharsizeArg arg; - CSType const cstype = init_charsize_arg(&arg, wp, lnum, s); - if (*s == NUL && arg.virt_row < 0) { + CharsizeArg csarg; + CSType const cstype = init_charsize_arg(&csarg, wp, lnum, s); + if (*s == NUL && csarg.virt_row < 0) { return 1; // be quick for an empty line } int64_t col; if (cstype == kCharsizeFast) { - col = linesize_fast(&arg, 0, MAXCOL); + col = linesize_fast(&csarg, 0, MAXCOL); } else { - col = linesize_regular(&arg, 0, MAXCOL); + col = linesize_regular(&csarg, 0, MAXCOL); } // If list mode is on, then the '$' at the end of the line may take up one @@ -774,20 +776,20 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column) char *line = ml_get_buf(wp->w_buffer, lnum); - CharsizeArg cts; - CSType const cstype = init_charsize_arg(&cts, wp, lnum, line); + CharsizeArg csarg; + CSType const cstype = init_charsize_arg(&csarg, wp, lnum, line); colnr_T vcol = 0; StrCharInfo ci = utf_ptr2StrCharInfo(line); if (cstype == kCharsizeFast) { - bool const use_tabstop = cts.use_tabstop; + bool const use_tabstop = csarg.use_tabstop; while (*ci.ptr != NUL && --column >= 0) { vcol += charsize_fast_impl(wp, use_tabstop, vcol, ci.chr.value).width; ci = utfc_next(ci); } } else { while (*ci.ptr != NUL && --column >= 0) { - vcol += charsize_regular(&cts, ci.ptr, vcol, ci.chr.value).width; + vcol += charsize_regular(&csarg, ci.ptr, vcol, ci.chr.value).width; ci = utfc_next(ci); } } @@ -798,8 +800,8 @@ int plines_win_col(win_T *wp, linenr_T lnum, long column) // wraps from one screen line to the next (when 'columns' is not a multiple // of 'ts') -- webb. colnr_T col = vcol; - if (ci.chr.value == TAB && (State & MODE_NORMAL) && cts.use_tabstop) { - col += win_charsize(cstype, col, ci.ptr, ci.chr.value, &cts).width - 1; + if (ci.chr.value == TAB && (State & MODE_NORMAL) && csarg.use_tabstop) { + col += win_charsize(cstype, col, ci.ptr, ci.chr.value, &csarg).width - 1; } // Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. |