diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2015-03-18 22:38:19 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2015-04-05 11:34:13 +0200 |
commit | 5600b80c1fcdf9d056bb7a0b5a74e5563dcb991f (patch) | |
tree | 354d2a30a3301b499fa8e67e2682d39c6be2e095 | |
parent | 638ceea092f01675e964a5e5a6adc6af8f28f423 (diff) | |
download | rneovim-5600b80c1fcdf9d056bb7a0b5a74e5563dcb991f.tar.gz rneovim-5600b80c1fcdf9d056bb7a0b5a74e5563dcb991f.tar.bz2 rneovim-5600b80c1fcdf9d056bb7a0b5a74e5563dcb991f.zip |
clipboard: show "* and "+ in :registers
Helped-by: Robin Allen <r@foon.uk>
Helped-by: Scott Prager <splinterofchaos@gmail.com>
-rw-r--r-- | src/nvim/ops.c | 57 | ||||
-rw-r--r-- | test/functional/clipboard/clipboard_provider_spec.lua | 24 |
2 files changed, 58 insertions, 23 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 2714798368..e73868a0fa 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -57,10 +57,15 @@ * 1..9 = registers '1' to '9', for deletes * 10..35 = registers 'a' to 'z' * 36 = delete register '-' + * 37 = selection register '*' + * 38 = clipboard register '+' */ -#define NUM_REGISTERS 38 #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_LATEST (-1) @@ -771,8 +776,10 @@ void get_yank_register(int regname, int writing) y_append = TRUE; } else if (regname == '-') i = DELETION_REGISTER; - else if (regname == '*' || regname == '+') - i = CLIP_REGISTER; + else if (regname == '*') + i = STAR_REGISTER; + else if (regname == '+') + i = PLUS_REGISTER; else /* not 0-9, a-z, A-Z or '-': use register 0 */ i = 0; y_current = &(y_regs[i]); @@ -792,7 +799,7 @@ get_register ( ) FUNC_ATTR_NONNULL_RET { get_yank_register(name, 0); - get_clipboard(name); + get_clipboard(name, false); struct yankreg *reg = xmalloc(sizeof(struct yankreg)); *reg = *y_current; @@ -960,7 +967,7 @@ do_execreg ( } execreg_lastc = regname; - get_clipboard(regname); + get_clipboard(regname, false); if (regname == '_') /* black hole: don't stuff anything */ return OK; @@ -1125,7 +1132,7 @@ insert_reg ( if (regname != NUL && !valid_yank_reg(regname, FALSE)) return FAIL; - get_clipboard(regname); + get_clipboard(regname, false); if (regname == '.') /* insert last inserted text */ retval = stuff_inserted(NUL, 1L, TRUE); @@ -2613,7 +2620,7 @@ do_put ( int allocated = FALSE; long cnt; - get_clipboard(regname); + get_clipboard(regname, false); if (flags & PUT_FIXINDENT) orig_indent = get_indent(); @@ -3190,6 +3197,10 @@ int get_register_name(int num) return num + '0'; else if (num == DELETION_REGISTER) return '-'; + else if (num == STAR_REGISTER) + return '*'; + else if (num == PLUS_REGISTER) + return '+'; else { return num + 'a' - 10; } @@ -3222,7 +3233,7 @@ void ex_display(exarg_T *eap) continue; /* did not ask for this register */ } - get_clipboard(name); + get_clipboard(name, true); if (i == -1) { if (y_previous != NULL) @@ -4566,12 +4577,11 @@ void write_viminfo_registers(FILE *fp) if (max_kbyte == 0) 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) continue; - // Skip '*'/'+' register, we don't want them back next time - if (i == CLIP_REGISTER) - continue; + /* Skip empty registers. */ num_lines = y_regs[i].y_size; if (num_lines == 0 @@ -4651,7 +4661,7 @@ char_u get_reg_type(int regname, long *reglen) return MCHAR; } - get_clipboard(regname); + get_clipboard(regname, false); if (regname != NUL && !valid_yank_reg(regname, FALSE)) return MAUTO; @@ -4712,7 +4722,7 @@ void *get_reg_contents(int regname, int flags) if (regname != NUL && !valid_yank_reg(regname, FALSE)) return NULL; - get_clipboard(regname); + get_clipboard(regname, false); char_u *retval; int allocated; @@ -5292,16 +5302,17 @@ static void free_register(struct yankreg *reg) } // 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(!eval_has_provider("clipboard")) { - EMSG("clipboard: provider is not available"); - return NULL; + if (!quiet) { + 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)) { 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]"); clipboard_didwarn_unnamed = true; } @@ -5324,9 +5335,9 @@ static struct yankreg* adjust_clipboard_name(int *name) { 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) { return; } @@ -5417,7 +5428,7 @@ err: static void set_clipboard(int name) { - struct yankreg* reg = adjust_clipboard_name(&name); + struct yankreg* reg = adjust_clipboard_name(&name, false); if (reg == NULL) { return; } diff --git a/test/functional/clipboard/clipboard_provider_spec.lua b/test/functional/clipboard/clipboard_provider_spec.lua index c5577327f9..c1c56c94c1 100644 --- a/test/functional/clipboard/clipboard_provider_spec.lua +++ b/test/functional/clipboard/clipboard_provider_spec.lua @@ -1,6 +1,7 @@ -- Test clipboard provider support local helpers = require('test.functional.helpers') +local Screen = require('test.functional.ui.screen') local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert 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 @@ -159,4 +160,27 @@ describe('clipboard usage', function() linewise stuff]]) 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) |