diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-06-12 20:19:44 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-06-12 20:19:44 +0200 |
commit | 6c6be9e88d72a60ee279ccad73d018c534b71d66 (patch) | |
tree | 93869209264c264dc481f4d48ecb6cfcb98b827c | |
parent | f6e020b1225970d95e6848b79066f82d9e65b66c (diff) |
patch 8.2.0963: number increment/decrement does not work with 'virtualedit'v8.2.0963
Problem: Number increment/decrement does not work with 'virtualedit'.
Solution: Handle coladd changing. (Christian Brabandt, closes #6240,
closes #923)
-rw-r--r-- | runtime/doc/options.txt | 2 | ||||
-rw-r--r-- | runtime/doc/various.txt | 2 | ||||
-rw-r--r-- | src/ops.c | 11 | ||||
-rw-r--r-- | src/testdir/test_increment.vim | 36 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 49 insertions, 4 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index d8e3192fda..779451b24c 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -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. diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 060cec02d1..9fe8d616da 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -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| @@ -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; } diff --git a/src/testdir/test_increment.vim b/src/testdir/test_increment.vim index 4a51b9cea6..abd85bed8a 100644 --- 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 diff --git a/src/version.c b/src/version.c index 8c8efd256b..1a2b7050b3 100644 --- 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, |