changeset 13620:4faf77b96432 v8.0.1682

patch 8.0.1682: auto indenting breaks inserting a block commit https://github.com/vim/vim/commit/8c87a2b1fec85e4aac33f71586ac1514536fc66b Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 10 13:15:47 2018 +0200 patch 8.0.1682: auto indenting breaks inserting a block Problem: Auto indenting breaks inserting a block. Solution: Do not check for cursor movement if indent was changed. (Christian Brabandt, closes #2778)
author Christian Brabandt <cb@256bit.org>
date Tue, 10 Apr 2018 13:30:07 +0200
parents 41ed86454233
children 5e77568222bd
files src/Makefile src/ops.c src/testdir/Make_all.mak src/testdir/test_blockedit.vim src/version.c
diffstat 5 files changed, 31 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile
+++ b/src/Makefile
@@ -2127,6 +2127,7 @@ test_arglist \
 	test_autocmd \
 	test_autoload \
 	test_backspace_opt \
+	test_blockedit \
 	test_breakindent \
 	test_bufline \
 	test_bufwintabinfo \
--- a/src/ops.c
+++ b/src/ops.c
@@ -1093,7 +1093,7 @@ do_record(int c)
 
     if (Recording == FALSE)	    /* start recording */
     {
-			/* registers 0-9, a-z and " are allowed */
+	/* registers 0-9, a-z and " are allowed */
 	if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
 	    retval = FAIL;
 	else
@@ -2702,6 +2702,7 @@ op_insert(oparg_T *oap, long count1)
     if (oap->block_mode)
     {
 	struct block_def	bd2;
+	int			did_indent = FALSE;
 
 	/* If indent kicked in, the firstline might have changed
 	 * but only do that, if the indent actually increased. */
@@ -2710,11 +2711,14 @@ op_insert(oparg_T *oap, long count1)
 	{
 	    bd.textcol += ind_post - ind_pre;
 	    bd.start_vcol += ind_post - ind_pre;
+	    did_indent = TRUE;
 	}
 
 	/* 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_orig.lnum && !bd.is_MAX)
+	 * to adjust the block for that.  But only do it, if the difference
+	 * does not come from indent kicking in. */
+	if (oap->start.lnum == curbuf->b_op_start_orig.lnum
+						  && !bd.is_MAX && !did_indent)
 	{
 	    if (oap->op_type == OP_INSERT
 		    && oap->start.col
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -72,6 +72,7 @@ NEW_TESTS = test_arabic.res \
 	    test_autocmd.res \
 	    test_autoload.res \
 	    test_backspace_opt.res \
+	    test_blockedit.res \
 	    test_breakindent.res \
 	    test_bufwintabinfo.res \
 	    test_cdo.res \
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_blockedit.vim
@@ -0,0 +1,20 @@
+" Test for block inserting
+"
+" TODO: rewrite test39.in into this new style test
+
+func Test_blockinsert_indent()
+  new
+  filetype plugin indent on
+  setlocal sw=2 et ft=vim
+  call setline(1, ['let a=[', '  ''eins'',', '  ''zwei'',', '  ''drei'']'])
+  call cursor(2, 3)
+  exe "norm! \<c-v>2jI\\ \<esc>"
+  call assert_equal(['let a=[', '      \ ''eins'',', '      \ ''zwei'',', '      \ ''drei'']'],
+        \ getline(1,'$'))
+  " reset to sane state
+  filetype off
+  bwipe!
+endfunc
+
+
+" vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1682,
+/**/
     1681,
 /**/
     1680,