mirror of
https://github.com/vim/vim.git
synced 2025-09-08 22:13:47 -04:00
updated for version 7.3.333
Problem: Using "." to repeat a Visual delete counts the size in bytes, not characters. (Connor Lane Smith) Solution: Store the virtual column numbers instead of byte positions.
This commit is contained in:
parent
e79d1535cf
commit
ca0c9fcda0
70
src/normal.c
70
src/normal.c
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
static int resel_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
|
static int resel_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
|
||||||
static linenr_T resel_VIsual_line_count; /* number of lines */
|
static linenr_T resel_VIsual_line_count; /* number of lines */
|
||||||
static colnr_T resel_VIsual_col; /* nr of cols or end col */
|
static colnr_T resel_VIsual_vcol; /* nr of cols or end col */
|
||||||
|
|
||||||
static int restart_VIsual_select = 0;
|
static int restart_VIsual_select = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -1436,7 +1436,7 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
/* The visual area is remembered for redo */
|
/* The visual area is remembered for redo */
|
||||||
static int redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
|
static int redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */
|
||||||
static linenr_T redo_VIsual_line_count; /* number of lines */
|
static linenr_T redo_VIsual_line_count; /* number of lines */
|
||||||
static colnr_T redo_VIsual_col; /* number of cols or end column */
|
static colnr_T redo_VIsual_vcol; /* number of cols or end column */
|
||||||
static long redo_VIsual_count; /* count for Visual operator */
|
static long redo_VIsual_count; /* count for Visual operator */
|
||||||
# ifdef FEAT_VIRTUALEDIT
|
# ifdef FEAT_VIRTUALEDIT
|
||||||
int include_line_break = FALSE;
|
int include_line_break = FALSE;
|
||||||
@ -1549,22 +1549,31 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
#ifdef FEAT_VISUAL
|
#ifdef FEAT_VISUAL
|
||||||
if (redo_VIsual_busy)
|
if (redo_VIsual_busy)
|
||||||
{
|
{
|
||||||
|
/* Redo of an operation on a Visual area. Use the same size from
|
||||||
|
* redo_VIsual_line_count and redo_VIsual_vcol. */
|
||||||
oap->start = curwin->w_cursor;
|
oap->start = curwin->w_cursor;
|
||||||
curwin->w_cursor.lnum += redo_VIsual_line_count - 1;
|
curwin->w_cursor.lnum += redo_VIsual_line_count - 1;
|
||||||
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
|
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
|
||||||
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
|
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
|
||||||
VIsual_mode = redo_VIsual_mode;
|
VIsual_mode = redo_VIsual_mode;
|
||||||
if (VIsual_mode == 'v')
|
if (redo_VIsual_vcol == MAXCOL || VIsual_mode == 'v')
|
||||||
{
|
{
|
||||||
if (redo_VIsual_line_count <= 1)
|
if (VIsual_mode == 'v')
|
||||||
curwin->w_cursor.col += redo_VIsual_col - 1;
|
{
|
||||||
|
if (redo_VIsual_line_count <= 1)
|
||||||
|
{
|
||||||
|
validate_virtcol();
|
||||||
|
curwin->w_curswant =
|
||||||
|
curwin->w_virtcol + redo_VIsual_vcol - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
curwin->w_curswant = redo_VIsual_vcol;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
curwin->w_cursor.col = redo_VIsual_col;
|
{
|
||||||
}
|
curwin->w_curswant = MAXCOL;
|
||||||
if (redo_VIsual_col == MAXCOL)
|
}
|
||||||
{
|
coladvance(curwin->w_curswant);
|
||||||
curwin->w_curswant = MAXCOL;
|
|
||||||
coladvance((colnr_T)MAXCOL);
|
|
||||||
}
|
}
|
||||||
cap->count0 = redo_VIsual_count;
|
cap->count0 = redo_VIsual_count;
|
||||||
if (redo_VIsual_count != 0)
|
if (redo_VIsual_count != 0)
|
||||||
@ -1710,7 +1719,7 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (redo_VIsual_busy)
|
else if (redo_VIsual_busy)
|
||||||
oap->end_vcol = oap->start_vcol + redo_VIsual_col - 1;
|
oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
|
||||||
/*
|
/*
|
||||||
* Correct oap->end.col and oap->start.col to be the
|
* Correct oap->end.col and oap->start.col to be the
|
||||||
* upper-left and lower-right corner of the block area.
|
* upper-left and lower-right corner of the block area.
|
||||||
@ -1735,13 +1744,22 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
*/
|
*/
|
||||||
resel_VIsual_mode = VIsual_mode;
|
resel_VIsual_mode = VIsual_mode;
|
||||||
if (curwin->w_curswant == MAXCOL)
|
if (curwin->w_curswant == MAXCOL)
|
||||||
resel_VIsual_col = MAXCOL;
|
resel_VIsual_vcol = MAXCOL;
|
||||||
else if (VIsual_mode == Ctrl_V)
|
|
||||||
resel_VIsual_col = oap->end_vcol - oap->start_vcol + 1;
|
|
||||||
else if (oap->line_count > 1)
|
|
||||||
resel_VIsual_col = oap->end.col;
|
|
||||||
else
|
else
|
||||||
resel_VIsual_col = oap->end.col - oap->start.col + 1;
|
{
|
||||||
|
if (VIsual_mode != Ctrl_V)
|
||||||
|
getvvcol(curwin, &(oap->end),
|
||||||
|
NULL, NULL, &oap->end_vcol);
|
||||||
|
if (VIsual_mode == Ctrl_V || oap->line_count <= 1)
|
||||||
|
{
|
||||||
|
if (VIsual_mode != Ctrl_V)
|
||||||
|
getvvcol(curwin, &(oap->start),
|
||||||
|
&oap->start_vcol, NULL, NULL);
|
||||||
|
resel_VIsual_vcol = oap->end_vcol - oap->start_vcol + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
resel_VIsual_vcol = oap->end_vcol;
|
||||||
|
}
|
||||||
resel_VIsual_line_count = oap->line_count;
|
resel_VIsual_line_count = oap->line_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1769,7 +1787,7 @@ do_pending_operator(cap, old_col, gui_yank)
|
|||||||
if (!redo_VIsual_busy)
|
if (!redo_VIsual_busy)
|
||||||
{
|
{
|
||||||
redo_VIsual_mode = resel_VIsual_mode;
|
redo_VIsual_mode = resel_VIsual_mode;
|
||||||
redo_VIsual_col = resel_VIsual_col;
|
redo_VIsual_vcol = resel_VIsual_vcol;
|
||||||
redo_VIsual_line_count = resel_VIsual_line_count;
|
redo_VIsual_line_count = resel_VIsual_line_count;
|
||||||
redo_VIsual_count = cap->count0;
|
redo_VIsual_count = cap->count0;
|
||||||
}
|
}
|
||||||
@ -7631,12 +7649,16 @@ nv_visual(cap)
|
|||||||
if (VIsual_mode == 'v')
|
if (VIsual_mode == 'v')
|
||||||
{
|
{
|
||||||
if (resel_VIsual_line_count <= 1)
|
if (resel_VIsual_line_count <= 1)
|
||||||
curwin->w_cursor.col += resel_VIsual_col * cap->count0 - 1;
|
{
|
||||||
|
validate_virtcol();
|
||||||
|
curwin->w_curswant = curwin->w_virtcol
|
||||||
|
+ resel_VIsual_vcol * cap->count0 - 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
curwin->w_cursor.col = resel_VIsual_col;
|
curwin->w_curswant = resel_VIsual_vcol;
|
||||||
check_cursor_col();
|
coladvance(curwin->w_curswant);
|
||||||
}
|
}
|
||||||
if (resel_VIsual_col == MAXCOL)
|
if (resel_VIsual_vcol == MAXCOL)
|
||||||
{
|
{
|
||||||
curwin->w_curswant = MAXCOL;
|
curwin->w_curswant = MAXCOL;
|
||||||
coladvance((colnr_T)MAXCOL);
|
coladvance((colnr_T)MAXCOL);
|
||||||
@ -7645,7 +7667,7 @@ nv_visual(cap)
|
|||||||
{
|
{
|
||||||
validate_virtcol();
|
validate_virtcol();
|
||||||
curwin->w_curswant = curwin->w_virtcol
|
curwin->w_curswant = curwin->w_virtcol
|
||||||
+ resel_VIsual_col * cap->count0 - 1;
|
+ resel_VIsual_vcol * cap->count0 - 1;
|
||||||
coladvance(curwin->w_curswant);
|
coladvance(curwin->w_curswant);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -709,6 +709,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
333,
|
||||||
/**/
|
/**/
|
||||||
332,
|
332,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user