From 0ab190c05706b1c72e6e2ca4d990febfa81cf886 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 23 May 2019 23:27:36 +0200 Subject: patch 8.1.1373: "[p" in Visual mode puts in wrong line Problem: "[p" in Visual mode puts in wrong line. Solution: Call nv_put() instead of duplicating the functionality. (closes #4408) --- src/normal.c | 74 ++++++++++++++---------------------------------- src/testdir/test_put.vim | 12 ++++++++ src/version.c | 2 ++ 3 files changed, 35 insertions(+), 53 deletions(-) diff --git a/src/normal.c b/src/normal.c index e297a2e77..cee90d413 100644 --- a/src/normal.c +++ b/src/normal.c @@ -143,6 +143,7 @@ static void nv_at(cmdarg_T *cap); static void nv_halfpage(cmdarg_T *cap); static void nv_join(cmdarg_T *cap); static void nv_put(cmdarg_T *cap); +static void nv_put_opt(cmdarg_T *cap, int fix_indent); static void nv_open(cmdarg_T *cap); #ifdef FEAT_NETBEANS_INTG static void nv_nbcmd(cmdarg_T *cap); @@ -6583,57 +6584,7 @@ nv_brackets(cmdarg_T *cap) */ else if (cap->nchar == 'p' || cap->nchar == 'P') { - if (!checkclearop(cap->oap)) - { - int dir = (cap->cmdchar == ']' && cap->nchar == 'p') - ? FORWARD : BACKWARD; - int regname = cap->oap->regname; - int was_visual = VIsual_active; - int line_count = curbuf->b_ml.ml_line_count; - pos_T start, end; - - if (VIsual_active) - { - start = LTOREQ_POS(VIsual, curwin->w_cursor) - ? VIsual : curwin->w_cursor; - end = EQUAL_POS(start,VIsual) ? curwin->w_cursor : VIsual; - curwin->w_cursor = (dir == BACKWARD ? start : end); - } -# ifdef FEAT_CLIPBOARD - adjust_clip_reg(®name); -# endif - prep_redo_cmd(cap); - - do_put(regname, dir, cap->count1, PUT_FIXINDENT); - if (was_visual) - { - VIsual = start; - curwin->w_cursor = end; - if (dir == BACKWARD) - { - /* adjust lines */ - VIsual.lnum += curbuf->b_ml.ml_line_count - line_count; - curwin->w_cursor.lnum += - curbuf->b_ml.ml_line_count - line_count; - } - - VIsual_active = TRUE; - if (VIsual_mode == 'V') - { - /* delete visually selected lines */ - cap->cmdchar = 'd'; - cap->nchar = NUL; - cap->oap->regname = regname; - nv_operator(cap); - do_pending_operator(cap, 0, FALSE); - } - if (VIsual_active) - { - end_visual_mode(); - redraw_later(SOME_VALID); - } - } - } + nv_put_opt(cap, TRUE); } /* @@ -9289,6 +9240,16 @@ nv_join(cmdarg_T *cap) */ static void nv_put(cmdarg_T *cap) +{ + nv_put_opt(cap, FALSE); +} + +/* + * "P", "gP", "p" and "gp" commands. + * "fix_indent" is TRUE for "[p", "[P", "]p" and "]P". + */ + static void +nv_put_opt(cmdarg_T *cap, int fix_indent) { int regname = 0; void *reg1 = NULL, *reg2 = NULL; @@ -9318,8 +9279,15 @@ nv_put(cmdarg_T *cap) #endif else { - dir = (cap->cmdchar == 'P' - || (cap->cmdchar == 'g' && cap->nchar == 'P')) + if (fix_indent) + { + dir = (cap->cmdchar == ']' && cap->nchar == 'p') + ? FORWARD : BACKWARD; + flags |= PUT_FIXINDENT; + } + else + dir = (cap->cmdchar == 'P' + || (cap->cmdchar == 'g' && cap->nchar == 'P')) ? BACKWARD : FORWARD; prep_redo_cmd(cap); if (cap->cmdchar == 'g') diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim index 2a9e8a3c0..80d2a2686 100644 --- a/src/testdir/test_put.vim +++ b/src/testdir/test_put.vim @@ -101,3 +101,15 @@ func Test_put_p_errmsg_nodup() delfunction Capture_p_error bwipeout! endfunc + +func Test_put_p_indent_visual() + new + call setline(1, ['select this text', 'select that text']) + " yank "that" from the second line + normal 2Gwvey + " select "this" in the first line and put + normal k0wve[p + call assert_equal('select that text', getline(1)) + call assert_equal('select that text', getline(2)) + bwipe! +endfunc diff --git a/src/version.c b/src/version.c index 7bac657e5..b3ecd8b20 100644 --- a/src/version.c +++ b/src/version.c @@ -767,6 +767,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1373, /**/ 1372, /**/ -- cgit v1.2.1