mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
clipboard: cleanup valid_yank_reg
and use it for :redir
This fixes missing clipboard support for `:redir` Helped-By: Michael Reed <m.reed@mykolab.com> Helped-By: Scott Prager <splinterofchaos@gmail.com>
This commit is contained in:
parent
edb13791bd
commit
26fedb133d
@ -6752,7 +6752,7 @@ static void ins_reg(void)
|
|||||||
|
|
||||||
regname = get_expr_register();
|
regname = get_expr_register();
|
||||||
}
|
}
|
||||||
if (regname == NUL || !valid_yank_reg(regname, FALSE)) {
|
if (regname == NUL || !valid_yank_reg(regname, false)) {
|
||||||
vim_beep();
|
vim_beep();
|
||||||
need_redraw = TRUE; /* remove the '"' */
|
need_redraw = TRUE; /* remove the '"' */
|
||||||
} else {
|
} else {
|
||||||
|
@ -6738,8 +6738,7 @@ static void ex_redir(exarg_T *eap)
|
|||||||
/* redirect to a register a-z (resp. A-Z for appending) */
|
/* redirect to a register a-z (resp. A-Z for appending) */
|
||||||
close_redir();
|
close_redir();
|
||||||
++arg;
|
++arg;
|
||||||
if (ASCII_ISALPHA(*arg)
|
if (valid_yank_reg(*arg, true) && *arg != '_') {
|
||||||
|| *arg == '"') {
|
|
||||||
redir_reg = *arg++;
|
redir_reg = *arg++;
|
||||||
if (*arg == '>' && arg[1] == '>') /* append */
|
if (*arg == '>' && arg[1] == '>') /* append */
|
||||||
arg += 2;
|
arg += 2;
|
||||||
|
@ -2318,7 +2318,7 @@ cmdline_paste (
|
|||||||
/* check for valid regname; also accept special characters for CTRL-R in
|
/* check for valid regname; also accept special characters for CTRL-R in
|
||||||
* the command line */
|
* the command line */
|
||||||
if (regname != Ctrl_F && regname != Ctrl_P && regname != Ctrl_W
|
if (regname != Ctrl_F && regname != Ctrl_P && regname != Ctrl_W
|
||||||
&& regname != Ctrl_A && !valid_yank_reg(regname, FALSE))
|
&& regname != Ctrl_A && !valid_yank_reg(regname, false))
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
/* A register containing CTRL-R can cause an endless loop. Allow using
|
/* A register containing CTRL-R can cause an endless loop. Allow using
|
||||||
|
@ -714,15 +714,13 @@ char_u *get_expr_line_src(void)
|
|||||||
return vim_strsave(expr_line);
|
return vim_strsave(expr_line);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/// Returns whether `regname` is a valid name of a yank register.
|
||||||
* Check if 'regname' is a valid name of a yank register.
|
/// Note: There is no check for 0 (default register), caller should do this.
|
||||||
* Note: There is no check for 0 (default register), caller should do this
|
/// The black hole register '_' is regarded as valid.
|
||||||
*/
|
///
|
||||||
int
|
/// @param regname name of register
|
||||||
valid_yank_reg (
|
/// @param writing allow only writable registers
|
||||||
int regname,
|
bool valid_yank_reg(int regname, bool writing)
|
||||||
int writing /* if TRUE check for writable registers */
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if ( (regname > 0 && ASCII_ISALNUM(regname))
|
if ( (regname > 0 && ASCII_ISALNUM(regname))
|
||||||
|| (!writing && vim_strchr((char_u *)
|
|| (!writing && vim_strchr((char_u *)
|
||||||
@ -734,8 +732,8 @@ valid_yank_reg (
|
|||||||
|| regname == '*'
|
|| regname == '*'
|
||||||
|| regname == '+'
|
|| regname == '+'
|
||||||
)
|
)
|
||||||
return TRUE;
|
return true;
|
||||||
return FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -826,7 +824,7 @@ yankreg_T *copy_register(int name)
|
|||||||
*/
|
*/
|
||||||
int yank_register_mline(int regname)
|
int yank_register_mline(int regname)
|
||||||
{
|
{
|
||||||
if (regname != 0 && !valid_yank_reg(regname, FALSE))
|
if (regname != 0 && !valid_yank_reg(regname, false))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (regname == '_') /* black hole is always empty */
|
if (regname == '_') /* black hole is always empty */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -894,7 +892,7 @@ int do_record(int c)
|
|||||||
static int stuff_yank(int regname, char_u *p)
|
static int stuff_yank(int regname, char_u *p)
|
||||||
{
|
{
|
||||||
/* check for read-only register */
|
/* check for read-only register */
|
||||||
if (regname != 0 && !valid_yank_reg(regname, TRUE)) {
|
if (regname != 0 && !valid_yank_reg(regname, true)) {
|
||||||
xfree(p);
|
xfree(p);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
@ -950,7 +948,7 @@ do_execreg (
|
|||||||
regname = execreg_lastc;
|
regname = execreg_lastc;
|
||||||
}
|
}
|
||||||
/* check for valid regname */
|
/* check for valid regname */
|
||||||
if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE)) {
|
if (regname == '%' || regname == '#' || !valid_yank_reg(regname, false)) {
|
||||||
emsg_invreg(regname);
|
emsg_invreg(regname);
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
@ -1116,7 +1114,7 @@ insert_reg (
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
/* check for valid regname */
|
/* check for valid regname */
|
||||||
if (regname != NUL && !valid_yank_reg(regname, FALSE))
|
if (regname != NUL && !valid_yank_reg(regname, false))
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
if (regname == '.') /* insert last inserted text */
|
if (regname == '.') /* insert last inserted text */
|
||||||
@ -2307,7 +2305,7 @@ bool op_yank(oparg_T *oap, bool message)
|
|||||||
FUNC_ATTR_NONNULL_ALL
|
FUNC_ATTR_NONNULL_ALL
|
||||||
{
|
{
|
||||||
// check for read-only register
|
// check for read-only register
|
||||||
if (oap->regname != 0 && !valid_yank_reg(oap->regname, TRUE)) {
|
if (oap->regname != 0 && !valid_yank_reg(oap->regname, true)) {
|
||||||
beep_flush();
|
beep_flush();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -4621,7 +4619,7 @@ char_u get_reg_type(int regname, long *reglen)
|
|||||||
return MCHAR;
|
return MCHAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (regname != NUL && !valid_yank_reg(regname, FALSE))
|
if (regname != NUL && !valid_yank_reg(regname, false))
|
||||||
return MAUTO;
|
return MAUTO;
|
||||||
|
|
||||||
yankreg_T *reg = get_yank_register(regname, YREG_PASTE);
|
yankreg_T *reg = get_yank_register(regname, YREG_PASTE);
|
||||||
@ -4677,7 +4675,7 @@ void *get_reg_contents(int regname, int flags)
|
|||||||
regname = '"';
|
regname = '"';
|
||||||
|
|
||||||
/* check for valid regname */
|
/* check for valid regname */
|
||||||
if (regname != NUL && !valid_yank_reg(regname, FALSE))
|
if (regname != NUL && !valid_yank_reg(regname, false))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
char_u *retval;
|
char_u *retval;
|
||||||
|
@ -305,4 +305,28 @@ describe('clipboard usage', function()
|
|||||||
feed(':<c-r>*<cr>')
|
feed(':<c-r>*<cr>')
|
||||||
expect('t/u/t/')
|
expect('t/u/t/')
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('supports :redir @*>', function()
|
||||||
|
execute("let g:test_clip['*'] = ['stuff']")
|
||||||
|
execute('redir @*>')
|
||||||
|
-- it is made empty
|
||||||
|
eq({{''}, 'v'}, eval("g:test_clip['*']"))
|
||||||
|
execute('let g:test = doesnotexist')
|
||||||
|
feed('<cr>')
|
||||||
|
eq({{
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'E121: Undefined variable: doesnotexist',
|
||||||
|
'E15: Invalid expression: doesnotexist',
|
||||||
|
}, 'v'}, eval("g:test_clip['*']"))
|
||||||
|
execute(':echo "Howdy!"')
|
||||||
|
eq({{
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
'E121: Undefined variable: doesnotexist',
|
||||||
|
'E15: Invalid expression: doesnotexist',
|
||||||
|
'',
|
||||||
|
'Howdy!',
|
||||||
|
}, 'v'}, eval("g:test_clip['*']"))
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user