summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-03-13 19:02:41 +0100
committerBram Moolenaar <Bram@vim.org>2013-03-13 19:02:41 +0100
commita390bb6ad307115c5893788f8f7e1ba5576800e0 (patch)
tree39a9e4de8084e515c071de027c9c680b78879094
parent4f8301f6415e86631dadbc19066ba0bc8550df49 (diff)
downloadvim-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)
-rw-r--r--src/normal.c13
-rw-r--r--src/testdir/test66.in10
-rw-r--r--src/testdir/test66.ok6
-rw-r--r--src/version.c2
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,