diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-09-22 16:37:07 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-09-22 16:37:07 +0200 |
commit | 23003e51e18371afda4420d9e171a3dcba5a31cc (patch) | |
tree | 0f1f96711b2f6ff2fb787b30c50d77d4eed81269 | |
parent | 40fa12aea352474d229f2f750e954a4318aead4e (diff) | |
download | vim-git-23003e51e18371afda4420d9e171a3dcba5a31cc.tar.gz |
patch 8.2.3454: using a count with "gp" leave cursor in wrong positionv8.2.3454
Problem: Using a count with "gp" leave cursor in wrong position. (Naohiro
Ono)
Solution: Count the inserted lines. (closes #8899)
-rw-r--r-- | src/register.c | 14 | ||||
-rw-r--r-- | src/testdir/test_put.vim | 10 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 23 insertions, 3 deletions
diff --git a/src/register.c b/src/register.c index b821a68d5..3ddacb8ee 100644 --- a/src/register.c +++ b/src/register.c @@ -2065,6 +2065,8 @@ do_put( } else { + linenr_T new_lnum = new_cursor.lnum; + // Insert at least one line. When y_type is MCHAR, break the first // line in two. for (cnt = 1; cnt <= count; ++cnt) @@ -2085,6 +2087,7 @@ do_put( STRCAT(newp, ptr); // insert second line ml_append(lnum, newp, (colnr_T)0, FALSE); + ++new_lnum; vim_free(newp); oldp = ml_get(lnum); @@ -2103,10 +2106,13 @@ do_put( for (; i < y_size; ++i) { - if ((y_type != MCHAR || i < y_size - 1) - && ml_append(lnum, y_array[i], (colnr_T)0, FALSE) + if (y_type != MCHAR || i < y_size - 1) + { + if (ml_append(lnum, y_array[i], (colnr_T)0, FALSE) == FAIL) goto error; + new_lnum++; + } lnum++; ++nr_lines; if (flags & PUT_FIXINDENT) @@ -2138,6 +2144,8 @@ do_put( lendiff -= (int)STRLEN(ml_get(lnum)); } } + if (cnt == 1) + new_lnum = lnum; } error: @@ -2195,7 +2203,7 @@ error: } else { - curwin->w_cursor.lnum = lnum; + curwin->w_cursor.lnum = new_lnum; curwin->w_cursor.col = col; } } diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim index 3d4c5e723..f03433628 100644 --- a/src/testdir/test_put.vim +++ b/src/testdir/test_put.vim @@ -122,4 +122,14 @@ func Test_put_visual_delete_all_lines() close! endfunc +func Test_gp_with_count_leaves_cursor_at_end() + new + call setline(1, '<---->') + call setreg('@', "foo\nbar", 'c') + exe "normal 1G3|3gpix\<Esc>" + call assert_equal(['<--foo', 'barfoo', 'barfoo', 'barx-->'], getline(1, '$')) + + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index b1130882f..fb36b14a1 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3454, +/**/ 3453, /**/ 3452, |