aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/normal.c58
-rw-r--r--src/nvim/testdir/test_put.vim12
2 files changed, 29 insertions, 41 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index ca586cca29..fbf1cc04e2 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -5638,44 +5638,7 @@ static void nv_brackets(cmdarg_T *cap)
* "[p", "[P", "]P" and "]p": put with indent adjustment
*/
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;
- linenr_T line_count = curbuf->b_ml.ml_line_count;
- pos_T start, end;
-
- if (VIsual_active) {
- start = ltoreq(VIsual, curwin->w_cursor) ? VIsual : curwin->w_cursor;
- end = equalpos(start, VIsual) ? curwin->w_cursor : VIsual;
- curwin->w_cursor = (dir == BACKWARD ? start : end);
- }
- prep_redo_cmd(cap);
- do_put(regname, NULL, 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);
}
/*
* "['", "[`", "]'" and "]`": jump to next mark
@@ -7799,6 +7762,13 @@ static void 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, bool fix_indent)
+{
int regname = 0;
yankreg_T *savereg = NULL;
bool empty = false;
@@ -7815,9 +7785,15 @@ static void nv_put(cmdarg_T *cap)
} else
clearopbeep(cap->oap);
} else {
- dir = (cap->cmdchar == 'P'
- || (cap->cmdchar == 'g' && cap->nchar == 'P'))
- ? BACKWARD : FORWARD;
+ 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')
flags |= PUT_CURSEND;
diff --git a/src/nvim/testdir/test_put.vim b/src/nvim/testdir/test_put.vim
index 43a5d18cb3..d8a231c52e 100644
--- a/src/nvim/testdir/test_put.vim
+++ b/src/nvim/testdir/test_put.vim
@@ -104,3 +104,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