vim-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 vim/vim#4408)
0ab190c057
This commit is contained in:
Jan Edmund Lazo
2019-05-23 19:35:44 -04:00
parent 66d127957e
commit b87a1db5ac
2 changed files with 29 additions and 41 deletions

View File

@@ -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
@@ -7798,6 +7761,13 @@ static void nv_join(cmdarg_T *cap)
* "P", "gP", "p" and "gp" commands.
*/
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;
@@ -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;