summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-23 23:27:36 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-23 23:27:36 +0200
commit0ab190c05706b1c72e6e2ca4d990febfa81cf886 (patch)
tree3feebb49e1cda191d9e19cc7da45a28517bdab5d
parent1c6fd1e100fd0457375642ec50d483bcc0f61bb2 (diff)
downloadvim-git-0ab190c05706b1c72e6e2ca4d990febfa81cf886.tar.gz
patch 8.1.1373: "[p" in Visual mode puts in wrong linev8.1.1373
Problem: "[p" in Visual mode puts in wrong line. Solution: Call nv_put() instead of duplicating the functionality. (closes #4408)
-rw-r--r--src/normal.c74
-rw-r--r--src/testdir/test_put.vim12
-rw-r--r--src/version.c2
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(&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')
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
@@ -768,6 +768,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1373,
+/**/
1372,
/**/
1371,