aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2015-03-18 22:38:19 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2015-04-05 11:34:13 +0200
commit5600b80c1fcdf9d056bb7a0b5a74e5563dcb991f (patch)
tree354d2a30a3301b499fa8e67e2682d39c6be2e095
parent638ceea092f01675e964a5e5a6adc6af8f28f423 (diff)
downloadrneovim-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.c57
-rw-r--r--test/functional/clipboard/clipboard_provider_spec.lua24
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)