clipboard: show "* and "+ in :registers

Helped-by: Robin Allen <r@foon.uk>
Helped-by: Scott Prager <splinterofchaos@gmail.com>
This commit is contained in:
Björn Linse 2015-03-18 22:38:19 +01:00
parent 638ceea092
commit 5600b80c1f
2 changed files with 58 additions and 23 deletions

View File

@ -57,10 +57,15 @@
* 1..9 = registers '1' to '9', for deletes * 1..9 = registers '1' to '9', for deletes
* 10..35 = registers 'a' to 'z' * 10..35 = registers 'a' to 'z'
* 36 = delete register '-' * 36 = delete register '-'
* 37 = selection register '*'
* 38 = clipboard register '+'
*/ */
#define NUM_REGISTERS 38
#define DELETION_REGISTER 36 #define DELETION_REGISTER 36
#define CLIP_REGISTER 37 #define NUM_SAVED_REGISTERS 37
// The following registers should not be saved in viminfo:
#define STAR_REGISTER 37
#define PLUS_REGISTER 38
#define NUM_REGISTERS 39
#define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS) #define CB_UNNAMEDMASK (CB_UNNAMED | CB_UNNAMEDPLUS)
#define CB_LATEST (-1) #define CB_LATEST (-1)
@ -771,8 +776,10 @@ void get_yank_register(int regname, int writing)
y_append = TRUE; y_append = TRUE;
} else if (regname == '-') } else if (regname == '-')
i = DELETION_REGISTER; i = DELETION_REGISTER;
else if (regname == '*' || regname == '+') else if (regname == '*')
i = CLIP_REGISTER; i = STAR_REGISTER;
else if (regname == '+')
i = PLUS_REGISTER;
else /* not 0-9, a-z, A-Z or '-': use register 0 */ else /* not 0-9, a-z, A-Z or '-': use register 0 */
i = 0; i = 0;
y_current = &(y_regs[i]); y_current = &(y_regs[i]);
@ -792,7 +799,7 @@ get_register (
) FUNC_ATTR_NONNULL_RET ) FUNC_ATTR_NONNULL_RET
{ {
get_yank_register(name, 0); get_yank_register(name, 0);
get_clipboard(name); get_clipboard(name, false);
struct yankreg *reg = xmalloc(sizeof(struct yankreg)); struct yankreg *reg = xmalloc(sizeof(struct yankreg));
*reg = *y_current; *reg = *y_current;
@ -960,7 +967,7 @@ do_execreg (
} }
execreg_lastc = regname; execreg_lastc = regname;
get_clipboard(regname); get_clipboard(regname, false);
if (regname == '_') /* black hole: don't stuff anything */ if (regname == '_') /* black hole: don't stuff anything */
return OK; return OK;
@ -1125,7 +1132,7 @@ insert_reg (
if (regname != NUL && !valid_yank_reg(regname, FALSE)) if (regname != NUL && !valid_yank_reg(regname, FALSE))
return FAIL; return FAIL;
get_clipboard(regname); get_clipboard(regname, false);
if (regname == '.') /* insert last inserted text */ if (regname == '.') /* insert last inserted text */
retval = stuff_inserted(NUL, 1L, TRUE); retval = stuff_inserted(NUL, 1L, TRUE);
@ -2613,7 +2620,7 @@ do_put (
int allocated = FALSE; int allocated = FALSE;
long cnt; long cnt;
get_clipboard(regname); get_clipboard(regname, false);
if (flags & PUT_FIXINDENT) if (flags & PUT_FIXINDENT)
orig_indent = get_indent(); orig_indent = get_indent();
@ -3190,6 +3197,10 @@ int get_register_name(int num)
return num + '0'; return num + '0';
else if (num == DELETION_REGISTER) else if (num == DELETION_REGISTER)
return '-'; return '-';
else if (num == STAR_REGISTER)
return '*';
else if (num == PLUS_REGISTER)
return '+';
else { else {
return num + 'a' - 10; return num + 'a' - 10;
} }
@ -3222,7 +3233,7 @@ void ex_display(exarg_T *eap)
continue; /* did not ask for this register */ continue; /* did not ask for this register */
} }
get_clipboard(name); get_clipboard(name, true);
if (i == -1) { if (i == -1) {
if (y_previous != NULL) if (y_previous != NULL)
@ -4566,12 +4577,11 @@ void write_viminfo_registers(FILE *fp)
if (max_kbyte == 0) if (max_kbyte == 0)
return; return;
for (i = 0; i < NUM_REGISTERS; i++) { // don't include clipboard registers '*'/'+'
for (i = 0; i < NUM_SAVED_REGISTERS; i++) {
if (y_regs[i].y_array == NULL) if (y_regs[i].y_array == NULL)
continue; continue;
// Skip '*'/'+' register, we don't want them back next time
if (i == CLIP_REGISTER)
continue;
/* Skip empty registers. */ /* Skip empty registers. */
num_lines = y_regs[i].y_size; num_lines = y_regs[i].y_size;
if (num_lines == 0 if (num_lines == 0
@ -4651,7 +4661,7 @@ char_u get_reg_type(int regname, long *reglen)
return MCHAR; return MCHAR;
} }
get_clipboard(regname); get_clipboard(regname, false);
if (regname != NUL && !valid_yank_reg(regname, FALSE)) if (regname != NUL && !valid_yank_reg(regname, FALSE))
return MAUTO; return MAUTO;
@ -4712,7 +4722,7 @@ void *get_reg_contents(int regname, int flags)
if (regname != NUL && !valid_yank_reg(regname, FALSE)) if (regname != NUL && !valid_yank_reg(regname, FALSE))
return NULL; return NULL;
get_clipboard(regname); get_clipboard(regname, false);
char_u *retval; char_u *retval;
int allocated; int allocated;
@ -5292,16 +5302,17 @@ static void free_register(struct yankreg *reg)
} }
// return target register // return target register
static struct yankreg* adjust_clipboard_name(int *name) { static struct yankreg* adjust_clipboard_name(int *name, bool quiet) {
if (*name == '*' || *name == '+') { if (*name == '*' || *name == '+') {
if(!eval_has_provider("clipboard")) { if(!eval_has_provider("clipboard")) {
EMSG("clipboard: provider is not available"); if (!quiet) {
return NULL; EMSG("clipboard: provider is not available");
}
} }
return &y_regs[CLIP_REGISTER]; return &y_regs[*name == '*' ? STAR_REGISTER : PLUS_REGISTER];
} else if ((*name == NUL || *name == CB_LATEST) && (cb_flags & CB_UNNAMEDMASK)) { } 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 (!quiet && !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;
} }
@ -5324,9 +5335,9 @@ static struct yankreg* adjust_clipboard_name(int *name) {
return NULL; return NULL;
} }
static void get_clipboard(int name) static void get_clipboard(int name, bool quiet)
{ {
struct yankreg* reg = adjust_clipboard_name(&name); struct yankreg* reg = adjust_clipboard_name(&name, quiet);
if (reg == NULL) { if (reg == NULL) {
return; return;
} }
@ -5417,7 +5428,7 @@ err:
static void set_clipboard(int name) static void set_clipboard(int name)
{ {
struct yankreg* reg = adjust_clipboard_name(&name); struct yankreg* reg = adjust_clipboard_name(&name, false);
if (reg == NULL) { if (reg == NULL) {
return; return;
} }

View File

@ -1,6 +1,7 @@
-- Test clipboard provider support -- Test clipboard provider support
local helpers = require('test.functional.helpers') local helpers = require('test.functional.helpers')
local Screen = require('test.functional.ui.screen')
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
local execute, expect, eq, eval = helpers.execute, helpers.expect, helpers.eq, helpers.eval local execute, expect, eq, eval = helpers.execute, helpers.expect, helpers.eq, helpers.eval
local nvim, run, stop, restart = helpers.nvim, helpers.run, helpers.stop, helpers.restart local nvim, run, stop, restart = helpers.nvim, helpers.run, helpers.stop, helpers.restart
@ -159,4 +160,27 @@ describe('clipboard usage', function()
linewise stuff]]) linewise stuff]])
end) end)
it('supports "+ and "* in registers', function()
local screen = Screen.new(60, 10)
screen:attach()
execute("let g:test_clip['*'] = ['some', 'star data','']")
execute("let g:test_clip['+'] = ['such', 'plus', 'stuff']")
execute("registers")
screen:expect([[
~ |
~ |
~ |
~ |
:registers |
{1:--- Registers ---} |
"* some{2:^J}star data{2:^J} |
"+ such{2:^J}plus{2:^J}stuff |
": let g:test_clip['+'] = ['such', 'plus', 'stuff'] |
{3:Press ENTER or type command to continue}^ |
]], {
[1] = {bold = true, foreground = Screen.colors.Fuchsia},
[2] = {foreground = Screen.colors.Blue},
[3] = {bold = true, foreground = Screen.colors.SeaGreen}},
{{bold = true, foreground = Screen.colors.Blue}})
end)
end) end)