diff options
author | Bram Moolenaar <bram@vim.org> | 2015-06-19 15:17:55 +0200 |
---|---|---|
committer | Bram Moolenaar <bram@vim.org> | 2015-06-19 15:17:55 +0200 |
commit | d9fb17902870e59d7d890d0933296755092a0ec1 (patch) | |
tree | 7ca020a8fea6bad04df820650a8e92130fe0b683 | |
parent | bc76366347a19c6fc26aeefd0c8d52eff3a6a3cb (diff) | |
download | vim-d9fb17902870e59d7d890d0933296755092a0ec1.tar.gz |
Problem: "p" in Visual mode causes an unexpected line split.
Solution: Advance the cursor first. (Yukihiro Nakadaira)
-rw-r--r-- | src/ops.c | 13 | ||||
-rw-r--r-- | src/testdir/test94.in | 36 | ||||
-rw-r--r-- | src/testdir/test94.ok | 31 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 80 insertions, 2 deletions
@@ -3459,17 +3459,26 @@ do_put(regname, dir, count, flags) { if (flags & PUT_LINE_SPLIT) { + char_u *p; + /* "p" or "P" in Visual mode: split the lines to put the text in * between. */ if (u_save_cursor() == FAIL) goto end; - ptr = vim_strsave(ml_get_cursor()); + p = ml_get_cursor(); + if (dir == FORWARD && *p != NUL) + mb_ptr_adv(p); + ptr = vim_strsave(p); if (ptr == NULL) goto end; ml_append(curwin->w_cursor.lnum, ptr, (colnr_T)0, FALSE); vim_free(ptr); - ptr = vim_strnsave(ml_get_curline(), curwin->w_cursor.col); + oldp = ml_get_curline(); + p = oldp + curwin->w_cursor.col; + if (dir == FORWARD && *p != NUL) + mb_ptr_adv(p); + ptr = vim_strnsave(oldp, p - oldp); if (ptr == NULL) goto end; ml_replace(curwin->w_cursor.lnum, ptr, FALSE); diff --git a/src/testdir/test94.in b/src/testdir/test94.in index e98d5887..287d9dc9 100644 --- a/src/testdir/test94.in +++ b/src/testdir/test94.in @@ -174,6 +174,42 @@ gH<Del> :$put ='c' kgH<Down><Del> :$put ='---' +: +:$put ='' +:$put ='v_p: replace last character with line register at middle line' +:$put ='aaa' +:$put ='bbb' +:$put ='ccc' +:-2yank +k$vp +:$put ='---' +: +:$put ='' +:$put ='v_p: replace last character with line register at middle line selecting newline' +:$put ='aaa' +:$put ='bbb' +:$put ='ccc' +:-2yank +k$v$p +:$put ='---' +: +:$put ='' +:$put ='v_p: replace last character with line register at last line' +:$put ='aaa' +:$put ='bbb' +:$put ='ccc' +:-2yank +$vp +:$put ='---' +: +:$put ='' +:$put ='v_p: replace last character with line register at last line selecting newline' +:$put ='aaa' +:$put ='bbb' +:$put ='ccc' +:-2yank +$v$p +:$put ='---' :/^start:/+2,$w! test.out :q! ENDTEST diff --git a/src/testdir/test94.ok b/src/testdir/test94.ok index 9207ea5b..a1b03781 100644 --- a/src/testdir/test94.ok +++ b/src/testdir/test94.ok @@ -81,3 +81,34 @@ b linewise select mode: delete last two line a --- + +v_p: replace last character with line register at middle line +aaa +bb +aaa + +ccc +--- + +v_p: replace last character with line register at middle line selecting newline +aaa +bb +aaa +ccc +--- + +v_p: replace last character with line register at last line +aaa +bbb +cc +aaa + +--- + +v_p: replace last character with line register at last line selecting newline +aaa +bbb +cc +aaa + +--- diff --git a/src/version.c b/src/version.c index 197b6ea0..1dcdf71e 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 743, +/**/ 742, /**/ 741, |