diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 7b42467184..92734e404a 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -7278,7 +7278,10 @@ static void nv_put(cmdarg_T *cap) */ was_visual = true; regname = cap->oap->regname; - if (regname == 0 || regname == '"' + // '+' and '*' could be the same selection + bool clipoverwrite = (regname == '+' || regname == '*') + && (cb_flags & CB_UNNAMEDMASK); + if (regname == 0 || regname == '"' || clipoverwrite || ascii_isdigit(regname) || regname == '-') { // The delete might overwrite the register we want to put, save it first savereg = copy_register(regname); diff --git a/src/nvim/ops.c b/src/nvim/ops.c index d8df6ae72d..063ad154f1 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -67,8 +67,6 @@ #define PLUS_REGISTER 38 #define NUM_REGISTERS 39 -#define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS) - static yankreg_T y_regs[NUM_REGISTERS]; static yankreg_T *y_previous = NULL; /* ptr to last written yankreg */ diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h index 80f2373a85..b13ead9cbb 100644 --- a/src/nvim/option_defs.h +++ b/src/nvim/option_defs.h @@ -318,6 +318,7 @@ static char *(p_cb_values[]) = {"unnamed", "unnamedplus", NULL}; #endif # define CB_UNNAMED 0x001 # define CB_UNNAMEDPLUS 0x002 +# define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS) EXTERN long p_cwh; /* 'cmdwinheight' */ EXTERN long p_ch; /* 'cmdheight' */ EXTERN int p_confirm; /* 'confirm' */ diff --git a/test/functional/clipboard/clipboard_provider_spec.lua b/test/functional/clipboard/clipboard_provider_spec.lua index 716bd88242..9282a66240 100644 --- a/test/functional/clipboard/clipboard_provider_spec.lua +++ b/test/functional/clipboard/clipboard_provider_spec.lua @@ -253,6 +253,12 @@ describe('clipboard usage', function() feed("viwp") eq({{'visual'}, 'v'}, eval("g:test_clip['*']")) expect("indeed clipboard") + + -- explicit "* should do the same + execute("let g:test_clip['*'] = [['star'], 'c']") + feed('viw"*p') + eq({{'clipboard'}, 'v'}, eval("g:test_clip['*']")) + expect("indeed star") end) end)