# HG changeset patch # User Bram Moolenaar # Date 1632321903 -7200 # Node ID 8ff483b86d9b01bf5a27720d28cf1fc310338e71 # Parent 9f8cd3eb33c79a4434e4d452a5526bbe7ce0251a patch 8.2.3454: using a count with "gp" leave cursor in wrong position Commit: https://github.com/vim/vim/commit/23003e51e18371afda4420d9e171a3dcba5a31cc Author: Bram Moolenaar Date: Wed Sep 22 16:37:07 2021 +0200 patch 8.2.3454: using a count with "gp" leave cursor in wrong position Problem: Using a count with "gp" leave cursor in wrong position. (Naohiro Ono) Solution: Count the inserted lines. (closes #8899) diff --git a/src/register.c b/src/register.c --- 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 --- 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\" + 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 --- 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,