Mercurial > vim
changeset 25840:8ff483b86d9b v8.2.3454
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 <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 22 Sep 2021 16:45:03 +0200 |
parents | 9f8cd3eb33c7 |
children | f3fc9c20b2b3 |
files | src/register.c src/testdir/test_put.vim src/version.c |
diffstat | 3 files changed, 23 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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; } }
--- 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