diff options
author | Bram Moolenaar <Bram@vim.org> | 2011-10-04 21:22:44 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2011-10-04 21:22:44 +0200 |
commit | ca0c9fcda04f532f2dcb306ffb37672feba00c10 (patch) | |
tree | 57bd0eb8f0abdeaa3c62701ee1b44d782101e0df /src/normal.c | |
parent | e79d1535cf1933729bb7352123c12cb91fd2ce0c (diff) |
updated for version 7.3.333v7.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.
Diffstat (limited to 'src/normal.c')
-rw-r--r-- | src/normal.c | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/src/normal.c b/src/normal.c index c028feaaaf..6bf547016b 100644 --- a/src/normal.c +++ b/src/normal.c @@ -20,7 +20,7 @@ */ static int resel_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */ 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; #endif @@ -1436,7 +1436,7 @@ do_pending_operator(cap, old_col, gui_yank) /* The visual area is remembered for redo */ static int redo_VIsual_mode = NUL; /* 'v', 'V', or Ctrl-V */ 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 */ # ifdef FEAT_VIRTUALEDIT int include_line_break = FALSE; @@ -1549,22 +1549,31 @@ do_pending_operator(cap, old_col, gui_yank) #ifdef FEAT_VISUAL 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; curwin->w_cursor.lnum += redo_VIsual_line_count - 1; if (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; - if (VIsual_mode == 'v') + if (redo_VIsual_vcol == MAXCOL || VIsual_mode == 'v') { - if (redo_VIsual_line_count <= 1) - curwin->w_cursor.col += redo_VIsual_col - 1; + if (VIsual_mode == 'v') + { + 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 - curwin->w_cursor.col = redo_VIsual_col; - } - if (redo_VIsual_col == MAXCOL) - { - curwin->w_curswant = MAXCOL; - coladvance((colnr_T)MAXCOL); + { + curwin->w_curswant = MAXCOL; + } + coladvance(curwin->w_curswant); } cap->count0 = redo_VIsual_count; if (redo_VIsual_count != 0) @@ -1710,7 +1719,7 @@ do_pending_operator(cap, old_col, gui_yank) } } 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 * 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; if (curwin->w_curswant == MAXCOL) - resel_VIsual_col = 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; + resel_VIsual_vcol = MAXCOL; 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; } @@ -1769,7 +1787,7 @@ do_pending_operator(cap, old_col, gui_yank) if (!redo_VIsual_busy) { 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_count = cap->count0; } @@ -7631,12 +7649,16 @@ nv_visual(cap) if (VIsual_mode == 'v') { 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 - curwin->w_cursor.col = resel_VIsual_col; - check_cursor_col(); + curwin->w_curswant = resel_VIsual_vcol; + coladvance(curwin->w_curswant); } - if (resel_VIsual_col == MAXCOL) + if (resel_VIsual_vcol == MAXCOL) { curwin->w_curswant = MAXCOL; coladvance((colnr_T)MAXCOL); @@ -7645,7 +7667,7 @@ nv_visual(cap) { validate_virtcol(); curwin->w_curswant = curwin->w_virtcol - + resel_VIsual_col * cap->count0 - 1; + + resel_VIsual_vcol * cap->count0 - 1; coladvance(curwin->w_curswant); } else |