patch 9.0.0067: cannot show virtual text
Problem: Cannot show virtual text.
Solution: Initial changes for virtual text support, using text properties.
diff --git a/src/ops.c b/src/ops.c
index fc49954..3a77164 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -307,7 +307,8 @@
if (!left)
{
- int tabs = 0, spaces = 0;
+ int tabs = 0, spaces = 0;
+ chartabsize_T cts;
/*
* 1. Get start vcol
@@ -332,13 +333,20 @@
else
++bd.textstart;
}
- for ( ; VIM_ISWHITE(*bd.textstart); )
+
+ // TODO: is passing bd.textstart for start of the line OK?
+ init_chartabsize_arg(&cts, curwin, curwin->w_cursor.lnum,
+ bd.start_vcol, bd.textstart, bd.textstart);
+ for ( ; VIM_ISWHITE(*cts.cts_ptr); )
{
- // TODO: is passing bd.textstart for start of the line OK?
- incr = lbr_chartabsize_adv(bd.textstart, &bd.textstart, bd.start_vcol);
+ incr = lbr_chartabsize_adv(&cts);
total += incr;
- bd.start_vcol += incr;
+ cts.cts_vcol += incr;
}
+ bd.textstart = cts.cts_ptr;
+ bd.start_vcol = cts.cts_vcol;
+ clear_chartabsize_arg(&cts);
+
// OK, now total=all the VWS reqd, and textstart points at the 1st
// non-ws char in the block.
#ifdef FEAT_VARTABS
@@ -381,6 +389,7 @@
size_t shift_amount;
char_u *non_white = bd.textstart;
colnr_T non_white_col;
+ chartabsize_T cts;
/*
* Firstly, let's find the first non-whitespace character that is
@@ -399,11 +408,16 @@
// The character's column is in "bd.start_vcol".
non_white_col = bd.start_vcol;
- while (VIM_ISWHITE(*non_white))
+ init_chartabsize_arg(&cts, curwin, curwin->w_cursor.lnum,
+ non_white_col, bd.textstart, non_white);
+ while (VIM_ISWHITE(*cts.cts_ptr))
{
- incr = lbr_chartabsize_adv(bd.textstart, &non_white, non_white_col);
- non_white_col += incr;
+ incr = lbr_chartabsize_adv(&cts);
+ cts.cts_vcol += incr;
}
+ non_white_col = cts.cts_vcol;
+ non_white = cts.cts_ptr;
+ clear_chartabsize_arg(&cts);
block_space_width = non_white_col - oap->start_vcol;
// We will shift by "total" or "block_space_width", whichever is less.
@@ -423,18 +437,19 @@
// column number.
if (bd.startspaces)
verbatim_copy_width -= bd.start_char_vcols;
- while (verbatim_copy_width < destination_col)
+ init_chartabsize_arg(&cts, curwin, 0, verbatim_copy_width,
+ bd.textstart, verbatim_copy_end);
+ while (cts.cts_vcol < destination_col)
{
- char_u *line = verbatim_copy_end;
-
- // TODO: is passing verbatim_copy_end for start of the line OK?
- incr = lbr_chartabsize(line, verbatim_copy_end,
- verbatim_copy_width);
- if (verbatim_copy_width + incr > destination_col)
+ incr = lbr_chartabsize(&cts);
+ if (cts.cts_vcol + incr > destination_col)
break;
- verbatim_copy_width += incr;
- MB_PTR_ADV(verbatim_copy_end);
+ cts.cts_vcol += incr;
+ MB_PTR_ADV(cts.cts_ptr);
}
+ verbatim_copy_width = cts.cts_vcol;
+ verbatim_copy_end = cts.cts_ptr;
+ clear_chartabsize_arg(&cts);
// If "destination_col" is different from the width of the initial
// part of the line that will be copied, it means we encountered a tab
@@ -703,8 +718,6 @@
* Put deleted text into register 1 and shift number registers if the
* delete contains a line break, or when using a specific operator (Vi
* compatible)
- * Use the register name from before adjust_clip_reg() may have
- * changed it.
*/
if (oap->motion_type == MLINE || oap->line_count > 1
|| oap->use_reg_one)
@@ -2213,6 +2226,7 @@
char_u *line;
char_u *prev_pstart;
char_u *prev_pend;
+ chartabsize_T cts;
#ifdef FEAT_LINEBREAK
int lbr_saved = curwin->w_p_lbr;
@@ -2232,14 +2246,14 @@
bdp->start_char_vcols = 0;
line = ml_get(lnum);
- pstart = line;
prev_pstart = line;
- while (bdp->start_vcol < oap->start_vcol && *pstart)
+ init_chartabsize_arg(&cts, curwin, lnum, bdp->start_vcol, line, line);
+ while (cts.cts_vcol < oap->start_vcol && *cts.cts_ptr != NUL)
{
// Count a tab for what it's worth (if list mode not on)
- incr = lbr_chartabsize(line, pstart, bdp->start_vcol);
- bdp->start_vcol += incr;
- if (VIM_ISWHITE(*pstart))
+ incr = lbr_chartabsize(&cts);
+ cts.cts_vcol += incr;
+ if (VIM_ISWHITE(*cts.cts_ptr))
{
bdp->pre_whitesp += incr;
bdp->pre_whitesp_c++;
@@ -2249,9 +2263,13 @@
bdp->pre_whitesp = 0;
bdp->pre_whitesp_c = 0;
}
- prev_pstart = pstart;
- MB_PTR_ADV(pstart);
+ prev_pstart = cts.cts_ptr;
+ MB_PTR_ADV(cts.cts_ptr);
}
+ bdp->start_vcol = cts.cts_vcol;
+ pstart = cts.cts_ptr;
+ clear_chartabsize_arg(&cts);
+
bdp->start_char_vcols = incr;
if (bdp->start_vcol < oap->start_vcol) // line too short
{
@@ -2295,14 +2313,20 @@
}
else
{
+ init_chartabsize_arg(&cts, curwin, lnum, bdp->end_vcol,
+ line, pend);
prev_pend = pend;
- while (bdp->end_vcol <= oap->end_vcol && *pend != NUL)
+ while (cts.cts_vcol <= oap->end_vcol && *cts.cts_ptr != NUL)
{
- // Count a tab for what it's worth (if list mode not on)
- prev_pend = pend;
- incr = lbr_chartabsize_adv(line, &pend, bdp->end_vcol);
- bdp->end_vcol += incr;
+ // count a tab for what it's worth (if list mode not on)
+ prev_pend = cts.cts_ptr;
+ incr = lbr_chartabsize_adv(&cts);
+ cts.cts_vcol += incr;
}
+ bdp->end_vcol = cts.cts_vcol;
+ pend = cts.cts_ptr;
+ clear_chartabsize_arg(&cts);
+
if (bdp->end_vcol <= oap->end_vcol
&& (!is_del
|| oap->op_type == OP_APPEND