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:
Björn Linse 2015-04-12 22:13:45 +02:00
parent edb13791bd
commit 26fedb133d
5 changed files with 43 additions and 22 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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)