mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
clipboard: show "* and "+ in :registers
Helped-by: Robin Allen <r@foon.uk> Helped-by: Scott Prager <splinterofchaos@gmail.com>
This commit is contained in:
parent
638ceea092
commit
5600b80c1f
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user