eval: Add ability to set the unnamed register with setreg

This commit is contained in:
AdnoC
2016-05-04 14:16:19 -04:00
parent a00b03d03f
commit 9a91ce4fa6
3 changed files with 29 additions and 1 deletions

View File

@@ -6710,6 +6710,8 @@ setreg({regname}, {value} [, {options}])
used as the width of the selection - if it is not specified used as the width of the selection - if it is not specified
then the width of the block is set to the number of characters then the width of the block is set to the number of characters
in the longest line (counting a <Tab> as 1 character). in the longest line (counting a <Tab> as 1 character).
If {options} contains "u" or '"', then the unnamed register is
set to point to register {regname}.
If {options} contains no register settings, then the default If {options} contains no register settings, then the default
is to use character mode unless {value} ends in a <NL> for is to use character mode unless {value} ends in a <NL> for

View File

@@ -5100,7 +5100,8 @@ bool garbage_collect(bool testing)
do { do {
yankreg_T reg; yankreg_T reg;
char name = NUL; char name = NUL;
reg_iter = op_register_iter(reg_iter, &name, &reg); bool is_unnamed = false;
reg_iter = op_register_iter(reg_iter, &name, &reg, &is_unnamed);
if (name != NUL) { if (name != NUL) {
ABORTING(set_ref_dict)(reg.additional_data, copyID); ABORTING(set_ref_dict)(reg.additional_data, copyID);
} }
@@ -14792,6 +14793,7 @@ static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
regname = '"'; regname = '"';
} }
bool set_unnamed = false;
if (argvars[2].v_type != VAR_UNKNOWN) { if (argvars[2].v_type != VAR_UNKNOWN) {
const char *stropt = tv_get_string_chk(&argvars[2]); const char *stropt = tv_get_string_chk(&argvars[2]);
if (stropt == NULL) { if (stropt == NULL) {
@@ -14820,6 +14822,10 @@ static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
} }
break; break;
} }
case 'u': case '"': { // unnamed register
set_unnamed = true;
break;
}
} }
} }
} }
@@ -14872,6 +14878,10 @@ free_lstval:
append, yank_type, block_len); append, yank_type, block_len);
} }
rettv->vval.v_number = 0; rettv->vval.v_number = 0;
if (set_unnamed) {
op_register_set_previous(regname);
}
} }
/* /*

View File

@@ -5853,3 +5853,19 @@ const yankreg_T *op_register_get(const char name)
} }
return &y_regs[i]; return &y_regs[i];
} }
/// Set the previous yank register
///
/// @param[in] name Register name.
///
/// @return true on success, false on failure.
bool op_register_set_previous(const char name)
{
int i = op_reg_index(name);
if (i == -1) {
return false;
}
y_previous = &y_regs[i];
return true;
}