changeset 20822:8e5f991db3b4 v8.2.0963

patch 8.2.0963: number increment/decrement does not work with 'virtualedit' Commit: https://github.com/vim/vim/commit/6c6be9e88d72a60ee279ccad73d018c534b71d66 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jun 12 20:19:44 2020 +0200 patch 8.2.0963: number increment/decrement does not work with 'virtualedit' Problem: Number increment/decrement does not work with 'virtualedit'. Solution: Handle coladd changing. (Christian Brabandt, closes https://github.com/vim/vim/issues/6240, closes #923)
author Bram Moolenaar <Bram@vim.org>
date Fri, 12 Jun 2020 20:30:04 +0200
parents 08f9e9d3726b
children 9c648a5f2eda
files runtime/doc/options.txt runtime/doc/various.txt src/ops.c src/testdir/test_increment.vim src/version.c
diffstat 5 files changed, 49 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -8556,8 +8556,6 @@ A jump table for the options with a shor
 					    *'virtualedit'* *'ve'*
 'virtualedit' 've'	string	(default "")
 			global
-			{not available when compiled without the
-			|+virtualedit| feature}
 	A comma separated list of these words:
 	    block	Allow virtual editing in Visual block mode.
 	    insert	Allow virtual editing in Insert mode.
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -470,7 +470,7 @@ B  *+vartabs*		Variable-width tabstops. 
 N  *+viminfo*		|'viminfo'|
    *+vertsplit*		Vertically split windows |:vsplit|; Always enabled
 			since 8.0.1118.
-N  *+virtualedit*	|'virtualedit'|
+N  *+virtualedit*	|'virtualedit'| Always enabled since 8.1.826.
 T  *+visual*		Visual mode |Visual-mode| Always enabled since 7.4.200.
 T  *+visualextra*	extra Visual mode commands |blockwise-operators|
 T  *+vreplace*		|gR| and |gr|
--- a/src/ops.c
+++ b/src/ops.c
@@ -2446,6 +2446,7 @@ do_addsub(
     int		maxlen = 0;
     pos_T	startpos;
     pos_T	endpos;
+    colnr_T	save_coladd = 0;
 
     do_hex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL);	// "heX"
     do_oct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL);	// "Octal"
@@ -2453,11 +2454,17 @@ do_addsub(
     do_alpha = (vim_strchr(curbuf->b_p_nf, 'p') != NULL);	// "alPha"
     do_unsigned = (vim_strchr(curbuf->b_p_nf, 'u') != NULL);	// "Unsigned"
 
+    if (virtual_active())
+    {
+	save_coladd = pos->coladd;
+	pos->coladd = 0;
+    }
+
     curwin->w_cursor = *pos;
     ptr = ml_get(pos->lnum);
     col = pos->col;
 
-    if (*ptr == NUL)
+    if (*ptr == NUL || col + !!save_coladd >= (int)STRLEN(ptr))
 	goto theend;
 
     /*
@@ -2824,6 +2831,8 @@ theend:
 	curwin->w_cursor = save_cursor;
     else if (did_change)
 	curwin->w_set_curswant = TRUE;
+    else if (virtual_active())
+	curwin->w_cursor.coladd = save_coladd;
 
     return did_change;
 }
--- a/src/testdir/test_increment.vim
+++ b/src/testdir/test_increment.vim
@@ -840,4 +840,40 @@ func Test_increment_unsigned()
   set nrformats-=unsigned
 endfunc
 
+func Test_normal_increment_with_virtualedit()
+  set virtualedit=all
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 0\<C-A>"
+  call assert_equal("\<TAB>2", getline(1))
+  call assert_equal([0, 1, 2, 0], getpos('.'))
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 0l\<C-A>"
+  call assert_equal("\<TAB>2", getline(1))
+  call assert_equal([0, 1, 2, 0], getpos('.'))
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 07l\<C-A>"
+  call assert_equal("\<TAB>2", getline(1))
+  call assert_equal([0, 1, 2, 0], getpos('.'))
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 0w\<C-A>"
+  call assert_equal("\<TAB>2", getline(1))
+  call assert_equal([0, 1, 2, 0], getpos('.'))
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 0wl\<C-A>"
+  call assert_equal("\<TAB>1", getline(1))
+  call assert_equal([0, 1, 3, 0], getpos('.'))
+
+  call setline(1, ["\<TAB>1"])
+  exec "norm! 0w30l\<C-A>"
+  call assert_equal("\<TAB>1", getline(1))
+  call assert_equal([0, 1, 3, 29], getpos('.'))
+
+  set virtualedit&
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    963,
+/**/
     962,
 /**/
     961,