clipboard: fix "" register not updated when clipboard=unnamed

Helped-By: Scott Prager <splinterofchaos@gmail.com>
This commit is contained in:
Björn Linse 2015-04-08 21:47:24 +02:00
parent 941b02af4c
commit 9978a01faa
2 changed files with 16 additions and 7 deletions

View File

@ -775,9 +775,12 @@ void get_yank_register(int regname, int mode)
{ {
int i; int i;
if (mode == YREG_PASTE && get_clipboard(regname, &y_current, false)) {
// y_current is set to clipboard contents.
return;
}
y_append = FALSE; y_append = FALSE;
int unnamedclip = cb_flags & CB_UNNAMEDMASK; if ((regname == 0 || regname == '"') && mode != YREG_YANK && y_previous != NULL) {
if ((regname == 0 || regname == '"') && !unnamedclip && mode != YREG_YANK && y_previous != NULL) {
y_current = y_previous; y_current = y_previous;
return; return;
} }
@ -801,8 +804,6 @@ void get_yank_register(int regname, int mode)
if (mode == YREG_YANK) { if (mode == YREG_YANK) {
// remember the written register for unnamed paste // remember the written register for unnamed paste
y_previous = y_current; y_previous = y_current;
} else if (mode == YREG_PASTE) {
get_clipboard(regname, &y_current, false);
} }
} }
@ -5366,11 +5367,11 @@ static struct yankreg* adjust_clipboard_name(int *name, bool quiet, bool writing
return NULL; return NULL;
} }
static void get_clipboard(int name, struct yankreg** target, bool quiet) static bool get_clipboard(int name, struct yankreg** target, bool quiet)
{ {
struct yankreg* reg = adjust_clipboard_name(&name, quiet, false); struct yankreg* reg = adjust_clipboard_name(&name, quiet, false);
if (reg == NULL) { if (reg == NULL) {
return; return false;
} }
free_register(reg); free_register(reg);
@ -5455,7 +5456,7 @@ static void get_clipboard(int name, struct yankreg** target, bool quiet)
} }
*target = reg; *target = reg;
return; return true;
err: err:
if (reg->y_array) { if (reg->y_array) {
@ -5467,6 +5468,8 @@ err:
reg->y_array = NULL; reg->y_array = NULL;
reg->y_size = 0; reg->y_size = 0;
EMSG("clipboard: provider returned invalid data"); EMSG("clipboard: provider returned invalid data");
*target = reg;
return false;
} }
static void set_clipboard(int name) static void set_clipboard(int name)

View File

@ -55,6 +55,12 @@ local function basic_register_test(noblock)
, stuff and some more , stuff and some more
some textsome some text, stuff and some more]]) some textsome some text, stuff and some more]])
-- deleting a line does update ""
feed('ggdd""P')
expect([[
, stuff and some more
some textsome some text, stuff and some more]])
feed('ggw<c-v>jwyggP') feed('ggw<c-v>jwyggP')
if noblock then if noblock then
expect([[ expect([[