Merge #1814 'clipboard: don't clobber "0 when deleting to unnamed'

This commit is contained in:
Justin M. Keyes 2015-01-27 19:43:35 -05:00
commit 997892157a
2 changed files with 44 additions and 19 deletions

View File

@ -61,7 +61,8 @@
#define DELETION_REGISTER 36 #define DELETION_REGISTER 36
#define CLIP_REGISTER 37 #define CLIP_REGISTER 37
# define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS) #define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS)
#define CB_LATEST (-1)
/* /*
* Each yank register is an array of pointers to lines. * Each yank register is an array of pointers to lines.
*/ */
@ -1382,10 +1383,9 @@ int op_delete(oparg_T *oap)
* register. For the black hole register '_' don't yank anything. * register. For the black hole register '_' don't yank anything.
*/ */
if (oap->regname != '_') { if (oap->regname != '_') {
bool unnamedclip = oap->regname == 0 && (cb_flags & CB_UNNAMEDMASK); if (oap->regname != 0) {
if (oap->regname != 0 || unnamedclip) {
/* check for read-only register */ /* check for read-only register */
if (!( valid_yank_reg(oap->regname, TRUE) || unnamedclip )) { if (!( valid_yank_reg(oap->regname, TRUE) )) {
beep_flush(); beep_flush();
return OK; return OK;
} }
@ -1421,6 +1421,9 @@ int op_delete(oparg_T *oap)
oap->regname = 0; oap->regname = 0;
} }
if(oap->regname == 0 && did_yank) {
set_clipboard(CB_LATEST);
}
/* /*
* If there's too much stuff to fit in the yank register, then get a * If there's too much stuff to fit in the yank register, then get a
* confirmation before doing the delete. This is crude, but simple. * confirmation before doing the delete. This is crude, but simple.
@ -5275,40 +5278,44 @@ static void free_register(struct yankreg *reg)
} }
// return target register // return target register
static int adjust_clipboard_name(int *name) { static struct yankreg* adjust_clipboard_name(int *name) {
if (*name == '*' || *name == '+') { if (*name == '*' || *name == '+') {
if(!eval_has_provider("clipboard")) { if(!eval_has_provider("clipboard")) {
EMSG("clipboard: provider is not available"); EMSG("clipboard: provider is not available");
return -1; return NULL;
} }
return CLIP_REGISTER; return &y_regs[CLIP_REGISTER];
} else if (*name == NUL && (cb_flags & (CB_UNNAMED | CB_UNNAMEDPLUS))) { } else if ((*name == NUL || *name == CB_LATEST) && (cb_flags & CB_UNNAMEDMASK)) {
if(!eval_has_provider("clipboard")) { if(!eval_has_provider("clipboard")) {
if (!clipboard_didwarn_unnamed) { if (!clipboard_didwarn_unnamed) {
msg((char_u*)"clipboard: provider not available, ignoring clipboard=unnamed[plus]"); msg((char_u*)"clipboard: provider not available, ignoring clipboard=unnamed[plus]");
clipboard_didwarn_unnamed = true; clipboard_didwarn_unnamed = true;
} }
return -1; return NULL;
}
struct yankreg* target;
if (*name == CB_LATEST) {
target = y_current;
} else {
target = &y_regs[0];
} }
if (cb_flags & CB_UNNAMEDPLUS) { if (cb_flags & CB_UNNAMEDPLUS) {
*name = '+'; *name = '+';
} else { } else {
*name = '*'; *name = '*';
} }
return 0; //unnamed return target; // unnamed register
} }
// don't do anything for other register names // don't do anything for other register names
return -1; return NULL;
} }
static void get_clipboard(int name) static void get_clipboard(int name)
{ {
int ireg = adjust_clipboard_name(&name); struct yankreg* reg = adjust_clipboard_name(&name);
if (ireg < 0) { if (reg == NULL) {
return; return;
} }
struct yankreg *reg = &y_regs[ireg];
free_register(reg); free_register(reg);
list_T *args = list_alloc(); list_T *args = list_alloc();
@ -5396,13 +5403,11 @@ err:
static void set_clipboard(int name) static void set_clipboard(int name)
{ {
int ireg = adjust_clipboard_name(&name); struct yankreg* reg = adjust_clipboard_name(&name);
if (ireg < 0) { if (reg == NULL) {
return; return;
} }
struct yankreg *reg = &y_regs[ireg];
list_T *lines = list_alloc(); list_T *lines = list_alloc();
for (int i = 0; i < reg->y_size; i++) { for (int i = 0; i < reg->y_size; i++) {

View File

@ -38,6 +38,26 @@ local function basic_register_test()
expect([[ expect([[
some text, stuff and some more some text, stuff and some more
random text]]) random text]])
-- deleting line or word uses "1/"- and doesn't clobber "0
-- and deleting word to unnamed doesn't clobber "1
feed('ggyyjdddw"0p"1p"-P')
expect([[
text, stuff and some more
some text, stuff and some more
some random text]])
-- delete line doesn't clobber "-
feed('dd"-P')
expect([[
text, stuff and some more
some some text, stuff and some more]])
-- deleting a word to named ("a) updates "1 (and not "-)
feed('gg"adwj"1P^"-P')
expect([[
, stuff and some more
some textsome some text, stuff and some more]])
reset() reset()
end end