diff src/normal.c @ 16742:75b5d77bbbab v8.1.1373

patch 8.1.1373: "[p" in Visual mode puts in wrong line commit https://github.com/vim/vim/commit/0ab190c05706b1c72e6e2ca4d990febfa81cf886 Author: Bram Moolenaar <Bram@vim.org> Date: Thu May 23 23:27:36 2019 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Thu, 23 May 2019 23:30:04 +0200
parents 7e733046db1d
children ce04ebdf26b8
line wrap: on
line diff
--- 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(&regname);
-# 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);
     }
 
     /*
@@ -9290,6 +9241,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;
     int		empty = FALSE;
@@ -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')