aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/normal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/normal.c')
-rw-r--r--src/nvim/normal.c35
1 files changed, 14 insertions, 21 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 0dbaf52b7e..aa617a20fa 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -1541,7 +1541,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
CancelRedo();
}
} else
- (void)op_yank(oap, false, !gui_yank);
+ (void)op_yank(oap, !gui_yank);
check_cursor_col();
break;
@@ -1995,7 +1995,7 @@ do_mouse (
if ((State & REPLACE_FLAG) && !yank_register_mline(regname))
insert_reg(regname, true);
else {
- do_put(regname, BACKWARD, 1L, fixindent | PUT_CURSEND);
+ do_put(regname, NULL, BACKWARD, 1L, fixindent | PUT_CURSEND);
/* Repeat it with CTRL-R CTRL-O r or CTRL-R CTRL-P r */
AppendCharToRedobuff(Ctrl_R);
@@ -2280,7 +2280,7 @@ do_mouse (
*/
if (restart_edit != 0)
where_paste_started = curwin->w_cursor;
- do_put(regname, dir, count, fixindent | PUT_CURSEND);
+ do_put(regname, NULL, dir, count, fixindent | PUT_CURSEND);
}
/*
* Ctrl-Mouse click or double click in a quickfix window jumps to the
@@ -5085,7 +5085,7 @@ static void nv_brackets(cmdarg_T *cap)
curwin->w_cursor = (dir == BACKWARD ? start : end);
}
prep_redo_cmd(cap);
- do_put(regname, dir, cap->count1, PUT_FIXINDENT);
+ do_put(regname, NULL, dir, cap->count1, PUT_FIXINDENT);
if (was_visual) {
VIsual = start;
curwin->w_cursor = end;
@@ -7221,7 +7221,7 @@ static void nv_join(cmdarg_T *cap)
static void nv_put(cmdarg_T *cap)
{
int regname = 0;
- void *reg1 = NULL, *reg2 = NULL;
+ yankreg_T *savereg = NULL;
bool empty = false;
bool was_visual = false;
int dir;
@@ -7252,11 +7252,9 @@ static void nv_put(cmdarg_T *cap)
was_visual = true;
regname = cap->oap->regname;
if (regname == 0 || regname == '"'
- || VIM_ISDIGIT(regname) || regname == '-'
- ) {
- /* The delete is going to overwrite the register we want to
- * put, save it first. */
- reg1 = get_register(regname, true);
+ || VIM_ISDIGIT(regname) || regname == '-') {
+ // The delete might overwrite the register we want to put, save it first
+ savereg = copy_register(regname);
}
/* Now delete the selected text. */
@@ -7270,13 +7268,6 @@ static void nv_put(cmdarg_T *cap)
/* delete PUT_LINE_BACKWARD; */
cap->oap->regname = regname;
- if (reg1 != NULL) {
- /* Delete probably changed the register we want to put, save
- * it first. Then put back what was there before the delete. */
- reg2 = get_register(regname, false);
- put_register(regname, reg1);
- }
-
/* When deleted a linewise Visual area, put the register as
* lines to avoid it joined with the next line. When deletion was
* characterwise, split a line when putting lines. */
@@ -7297,11 +7288,13 @@ static void nv_put(cmdarg_T *cap)
/* May have been reset in do_put(). */
VIsual_active = true;
}
- do_put(cap->oap->regname, dir, cap->count1, flags);
+ do_put(cap->oap->regname, savereg, dir, cap->count1, flags);
- /* If a register was saved, put it back now. */
- if (reg2 != NULL)
- put_register(regname, reg2);
+ // If a register was saved, free it
+ if (savereg != NULL) {
+ free_register(savereg);
+ xfree(savereg);
+ }
/* What to reselect with "gv"? Selecting the just put text seems to
* be the most useful, since the original text was removed. */