]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.085 v7.4.085
authorBram Moolenaar <Bram@vim.org>
Mon, 11 Nov 2013 00:29:22 +0000 (01:29 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 11 Nov 2013 00:29:22 +0000 (01:29 +0100)
Problem:    When inserting text in Visual block mode and moving the cursor the
            wrong text gets repeated in other lines.
Solution:   Use the '[ mark to find the start of the actually inserted text.
            (Christian Brabandt)

src/ops.c
src/testdir/test39.in
src/testdir/test39.ok
src/version.c

index 7571dc5c9ef212bfb04f011208ff17bc2bd8880d..0aebfa14f454f4a8d1a0ef39aa000c5b9198dba0 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -2640,6 +2640,31 @@ op_insert(oap, count1)
     {
        struct block_def        bd2;
 
+       /* The user may have moved the cursor before inserting something, try
+        * to adjust the block for that. */
+       if (oap->start.lnum == curbuf->b_op_start.lnum)
+       {
+           if (oap->op_type == OP_INSERT
+                   && oap->start.col != curbuf->b_op_start.col)
+           {
+               oap->start.col = curbuf->b_op_start.col;
+               pre_textlen -= getviscol2(oap->start.col, oap->start.coladd)
+                                                           - oap->start_vcol;
+               oap->start_vcol = getviscol2(oap->start.col, oap->start.coladd);
+           }
+           else if (oap->op_type == OP_APPEND
+                   && oap->end.col >= curbuf->b_op_start.col)
+           {
+               oap->start.col = curbuf->b_op_start.col;
+               /* reset pre_textlen to the value of OP_INSERT */
+               pre_textlen += bd.textlen;
+               pre_textlen -= getviscol2(oap->start.col, oap->start.coladd)
+                                                           - oap->start_vcol;
+               oap->start_vcol = getviscol2(oap->start.col, oap->start.coladd);
+               oap->op_type = OP_INSERT;
+           }
+       }
+
        /*
         * Spaces and tabs in the indent may have changed to other spaces and
         * tabs.  Get the starting column again and correct the length.
index 96995e0896ad6b049b0bc29ee024f9bd81fa76bc..77e2bd76893b8c980a3564fa670ab76388670779 100644 (file)
@@ -19,6 +19,10 @@ Gllll\16kkklllrq
 :" Test block-change
 G$khhh\16hhkkcmno\e
 :$-4,$w! test.out
+:" Test block-insert using cursor keys for movement
+/^aaaa/
+:exe ":norm! l\<C-V>jjjlllI\<Right>\<Right>  \<Esc>"
+:/^aa/,/^$/w >> test.out
 :" gUe must uppercase a whole word, also when ß changes to SS
 Gothe youtußeuu end\eYpk0wgUe
 :" gUfx must uppercase until x, inclusive.
@@ -40,6 +44,11 @@ G3o98765\e2k02l\162jr\16
 :qa!
 ENDTEST
 
+aaaaaa
+bbbbbb
+cccccc
+dddddd
+
 abcdefghijklm
 abcdefghijklm
 abcdefghijklm
index 4ebecf6cde60bfb4f90cf2960c4ffec2011efbda..4964d6a34b93691f1a8530296cb2a2994973317a 100644 (file)
Binary files a/src/testdir/test39.ok and b/src/testdir/test39.ok differ
index f9bb7dd9f3f5693e1a9ee16640df162c8d82884c..af31b4752be203247ab66b3d33de181fa505c1ec 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    85,
 /**/
     84,
 /**/