summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-09-22 16:37:07 +0200
committerBram Moolenaar <Bram@vim.org>2021-09-22 16:37:07 +0200
commit23003e51e18371afda4420d9e171a3dcba5a31cc (patch)
tree0f1f96711b2f6ff2fb787b30c50d77d4eed81269
parent40fa12aea352474d229f2f750e954a4318aead4e (diff)
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.c14
-rw-r--r--src/testdir/test_put.vim10
-rw-r--r--src/version.c2
3 files changed, 23 insertions, 3 deletions
diff --git a/src/register.c b/src/register.c
index b821a68d58..3ddacb8ee4 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 3d4c5e7230..f034336286 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 b1130882f8..fb36b14a13 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,