]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0963: number increment/decrement does not work with 'virtualedit' v8.2.0963
authorBram Moolenaar <Bram@vim.org>
Fri, 12 Jun 2020 18:19:44 +0000 (20:19 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 12 Jun 2020 18:19:44 +0000 (20:19 +0200)
Problem:    Number increment/decrement does not work with 'virtualedit'.
Solution:   Handle coladd changing. (Christian Brabandt, closes #6240,
            closes #923)

runtime/doc/options.txt
runtime/doc/various.txt
src/ops.c
src/testdir/test_increment.vim
src/version.c

index d8e3192fdae85c6ec1936bc83c22fc6817c2fde0..779451b24c93bf9d24a5e03d158d9c504a1e7cf5 100644 (file)
@@ -8556,8 +8556,6 @@ A jump table for the options with a short description can be found at |Q_op|.
                                            *'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.
index 060cec02d1e342597aba44bfce1b85343d4946c5..9fe8d616daff94582544f00f0429f82da9d30305 100644 (file)
@@ -470,7 +470,7 @@ B  *+vartabs*               Variable-width tabstops. |'vartabstop'|
 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|
index ca00c252d73b27ec9dfee612db93ca800339f504..8f31deb67a33e9e518e6c6cdf856b3091abc8ee0 100644 (file)
--- 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;
 }
index 4a51b9cea634cb8e625351e20fe3e4ac07e80e6e..abd85bed8a6e93cdb0a66c33f686a9a472ed5135 100644 (file)
@@ -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
index 8c8efd256baa3f0b412d442be60b593835644c8c..1a2b7050b31c165550035124597300102b106e0d 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    963,
 /**/
     962,
 /**/