diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-03-13 19:02:41 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-03-13 19:02:41 +0100 |
commit | a390bb6ad307115c5893788f8f7e1ba5576800e0 (patch) | |
tree | 39a9e4de8084e515c071de027c9c680b78879094 /src | |
parent | 4f8301f6415e86631dadbc19066ba0bc8550df49 (diff) | |
download | vim-git-a390bb6ad307115c5893788f8f7e1ba5576800e0.tar.gz |
updated for version 7.3.858v7.3.858
Problem: "gv" selects the wrong area after some operators.
Solution: Save and restore the type of selection. (Christian Brabandt)
Diffstat (limited to 'src')
-rw-r--r-- | src/normal.c | 13 | ||||
-rw-r--r-- | src/testdir/test66.in | 10 | ||||
-rw-r--r-- | src/testdir/test66.ok | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 30 insertions, 1 deletions
diff --git a/src/normal.c b/src/normal.c index f9050db62..3de170d6e 100644 --- a/src/normal.c +++ b/src/normal.c @@ -21,6 +21,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_vcol; /* nr of cols or end col */ +static int VIsual_mode_orig = NUL; /* type of Visual mode, that user entered */ static int restart_VIsual_select = 0; #endif @@ -1594,6 +1595,11 @@ do_pending_operator(cap, old_col, gui_yank) curbuf->b_visual.vi_start = VIsual; curbuf->b_visual.vi_end = curwin->w_cursor; curbuf->b_visual.vi_mode = VIsual_mode; + if (VIsual_mode_orig != NUL) + { + curbuf->b_visual.vi_mode = VIsual_mode_orig; + VIsual_mode_orig = NUL; + } curbuf->b_visual.vi_curswant = curwin->w_curswant; # ifdef FEAT_EVAL curbuf->b_visual_mode_eval = VIsual_mode; @@ -7230,6 +7236,7 @@ nv_Replace(cap) { cap->cmdchar = 'c'; cap->nchar = NUL; + VIsual_mode_orig = VIsual_mode; /* remember original area for gv */ VIsual_mode = 'V'; nv_operator(cap); } @@ -7429,7 +7436,10 @@ v_visop(cap) if (isupper(cap->cmdchar)) { if (VIsual_mode != Ctrl_V) + { + VIsual_mode_orig = VIsual_mode; VIsual_mode = 'V'; + } else if (cap->cmdchar == 'C' || cap->cmdchar == 'D') curwin->w_curswant = MAXCOL; } @@ -7449,7 +7459,10 @@ nv_subst(cap) if (VIsual_active) /* "vs" and "vS" are the same as "vc" */ { if (cap->cmdchar == 'S') + { + VIsual_mode_orig = VIsual_mode; VIsual_mode = 'V'; + } cap->cmdchar = 'c'; nv_operator(cap); } diff --git a/src/testdir/test66.in b/src/testdir/test66.in index 113b54066..f1fdce379 100644 --- a/src/testdir/test66.in +++ b/src/testdir/test66.in @@ -3,12 +3,14 @@ Test for visual block shift and tab characters. STARTTEST :so small.vim +/^one +fe4jRugvr1:'<,'>w! test.out /^abcdefgh 4jI j<<11|D 7|a 7|a 7|a 4k13|4j< -:$-4,$w! test.out +:$-5,$w >> test.out :$-4,$s/\s\+//g 4kI j<< 7|a @@ -18,6 +20,12 @@ STARTTEST :qa! ENDTEST +one two three +one two three +one two three +one two three +one two three + abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz diff --git a/src/testdir/test66.ok b/src/testdir/test66.ok index 2c2249b09..4c3ab0fb5 100644 --- a/src/testdir/test66.ok +++ b/src/testdir/test66.ok @@ -1,3 +1,9 @@ +on1 two three +on1 two three +on1 two three +on1 two three +on1 two three + abcdefghijklmnopqrstuvwxyz abcdefghij abc defghijklmnopqrstuvwxyz diff --git a/src/version.c b/src/version.c index f865b72a7..dc224d631 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 858, +/**/ 857, /**/ 856, |