aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/normal.c12
-rw-r--r--src/nvim/testdir/test_visual.vim80
2 files changed, 62 insertions, 30 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 2eb3c4be72..81c95ec77f 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -7108,7 +7108,7 @@ static void nv_put_opt(cmdarg_T *cap, bool fix_indent)
// overwrites if the old contents is being put.
was_visual = true;
regname = cap->oap->regname;
- bool save_unnamed = cap->cmdchar == 'P';
+ bool keep_registers = cap->cmdchar == 'P';
// '+' and '*' could be the same selection
bool clipoverwrite = (regname == '+' || regname == '*') && (cb_flags & CB_UNNAMEDMASK);
if (regname == 0 || regname == '"' || clipoverwrite
@@ -7123,23 +7123,15 @@ static void nv_put_opt(cmdarg_T *cap, bool fix_indent)
// do_put(), which requires the visual selection to still be active.
if (!VIsual_active || VIsual_mode == 'V' || regname != '.') {
// Now delete the selected text. Avoid messages here.
- yankreg_T *old_y_previous;
- if (save_unnamed) {
- old_y_previous = get_y_previous();
- }
cap->cmdchar = 'd';
cap->nchar = NUL;
- cap->oap->regname = NUL;
+ cap->oap->regname = keep_registers ? '_' : NUL;
msg_silent++;
nv_operator(cap);
do_pending_operator(cap, 0, false);
empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
msg_silent--;
- if (save_unnamed) {
- set_y_previous(old_y_previous);
- }
-
// delete PUT_LINE_BACKWARD;
cap->oap->regname = regname;
}
diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim
index ae8f9ba70b..2b88deb813 100644
--- a/src/nvim/testdir/test_visual.vim
+++ b/src/nvim/testdir/test_visual.vim
@@ -1350,34 +1350,74 @@ func Test_visual_paste()
call assert_equal('x', @-)
call assert_equal('bazooxxf', getline(1))
- if has('clipboard')
- " v_P does not overwrite unnamed register.
+ bwipe!
+endfunc
+
+func Test_visual_paste_clipboard()
+ CheckFeature clipboard_working
+
+ if has('gui')
+ " auto select feature breaks tests
+ set guioptions-=a
+ endif
+
+ " v_P does not overwrite unnamed register.
+ call setline(1, ['xxxx'])
+ call setreg('"', 'foo')
+ call setreg('-', 'bar')
+ normal gg0vP
+ call assert_equal('foo', @")
+ call assert_equal('bar', @-)
+ call assert_equal('fooxxx', getline(1))
+ normal $vP
+ call assert_equal('foo', @")
+ call assert_equal('bar', @-)
+ call assert_equal('fooxxfoo', getline(1))
+ " Test with a different register as unnamed register.
+ call setline(2, ['baz'])
+ normal 2gg0"rD
+ call assert_equal('baz', @")
+ normal gg0vP
+ call assert_equal('baz', @")
+ call assert_equal('bar', @-)
+ call assert_equal('bazooxxfoo', getline(1))
+ normal $vP
+ call assert_equal('baz', @")
+ call assert_equal('bar', @-)
+ call assert_equal('bazooxxfobaz', getline(1))
+
+ " Test for unnamed clipboard
+ set clipboard=unnamed
+ call setline(1, ['xxxx'])
+ call setreg('"', 'foo')
+ call setreg('-', 'bar')
+ call setreg('*', 'baz')
+ normal gg0vP
+ call assert_equal('foo', @")
+ call assert_equal('bar', @-)
+ call assert_equal('baz', @*)
+ call assert_equal('bazxxx', getline(1))
+
+ " Test for unnamedplus clipboard
+ if has('unnamedplus')
+ set clipboard=unnamedplus
call setline(1, ['xxxx'])
call setreg('"', 'foo')
call setreg('-', 'bar')
+ call setreg('+', 'baz')
normal gg0vP
call assert_equal('foo', @")
- call assert_equal('x', @-)
- call assert_equal('fooxxx', getline(1))
- normal $vP
- call assert_equal('foo', @")
- call assert_equal('x', @-)
- call assert_equal('fooxxfoo', getline(1))
- " Test with a different register as unnamed register.
- call setline(2, ['baz'])
- normal 2gg0"rD
- call assert_equal('baz', @")
- normal gg0vP
- call assert_equal('baz', @")
- call assert_equal('f', @-)
- call assert_equal('bazooxxfoo', getline(1))
- normal $vP
- call assert_equal('baz', @")
- call assert_equal('o', @-)
- call assert_equal('bazooxxfobaz', getline(1))
+ call assert_equal('bar', @-)
+ call assert_equal('baz', @+)
+ call assert_equal('bazxxx', getline(1))
endif
+ set clipboard&
+ if has('gui')
+ set guioptions&
+ endif
bwipe!
endfunc
+
" vim: shiftwidth=2 sts=2 expandtab