aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorScott Prager <splinterofchaos@gmail.com>2014-09-03 01:02:47 -0400
committerScott Prager <splinterofchaos@gmail.com>2014-12-11 20:30:00 -0500
commit5fdca47962fac359e616ef8c6dee3a793cb08168 (patch)
treee4cafbd6e34eacc3d424c25d8253c6a2b6c1392b /src/nvim/eval.c
parent2f8cc3b9d5f3dd56949d4b9c876fdff1e14e46cf (diff)
downloadrneovim-5fdca47962fac359e616ef8c6dee3a793cb08168.tar.gz
rneovim-5fdca47962fac359e616ef8c6dee3a793cb08168.tar.bz2
rneovim-5fdca47962fac359e616ef8c6dee3a793cb08168.zip
vim-patch:7.4.243
Problem: Cannot use setreg() to add text that includes a NUL. Solution: Make setreg() accept a list. https://code.google.com/p/vim/source/detail?r=v7-4-243
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 815df19476..2e2871abc5 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -13328,7 +13328,6 @@ static void f_setreg(typval_T *argvars, typval_T *rettv)
int regname;
char_u *strregname;
char_u *stropt;
- char_u *strval;
int append;
char_u yank_type;
long block_len;
@@ -13345,8 +13344,6 @@ static void f_setreg(typval_T *argvars, typval_T *rettv)
regname = *strregname;
if (regname == 0 || regname == '@')
regname = '"';
- else if (regname == '=')
- return;
if (argvars[2].v_type != VAR_UNKNOWN) {
stropt = get_tv_string_chk(&argvars[2]);
@@ -13374,10 +13371,32 @@ static void f_setreg(typval_T *argvars, typval_T *rettv)
}
}
- strval = get_tv_string_chk(&argvars[1]);
- if (strval != NULL)
- write_reg_contents_ex(regname, strval, -1,
- append, yank_type, block_len);
+ if (argvars[1].v_type == VAR_LIST) {
+ int len = argvars[1].vval.v_list->lv_len;
+ char_u **lstval = xmalloc(sizeof(char_u *) * (len + 1));
+ char_u **curval = lstval;
+
+ for (listitem_T *li = argvars[1].vval.v_list->lv_first;
+ li != NULL;
+ li = li->li_next) {
+ char_u *strval = get_tv_string_chk(&li->li_tv);
+ if (strval == NULL) {
+ free(lstval);
+ return;
+ }
+ *curval++ = strval;
+ }
+ *curval++ = NULL;
+
+ write_reg_contents_lst(regname, lstval, -1, append, yank_type, block_len);
+ free(lstval);
+ } else {
+ char_u *strval = get_tv_string_chk(&argvars[1]);
+ if (strval == NULL) {
+ return;
+ }
+ write_reg_contents_ex(regname, strval, -1, append, yank_type, block_len);
+ }
rettv->vval.v_number = 0;
}