diff options
Diffstat (limited to 'src/nvim/eval.c')
| -rw-r--r-- | src/nvim/eval.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 006698d134..2e0b67593c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -15073,7 +15073,6 @@ static void f_serverstop(typval_T *argvars, typval_T *rettv, FunPtr fptr)  static void f_setbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)  {    buf_T       *buf; -  aco_save_T aco;    char_u      *varname, *bufvarname;    typval_T    *varp;    char_u nbuf[NUMBUFLEN]; @@ -15086,29 +15085,34 @@ static void f_setbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr)    varp = &argvars[2];    if (buf != NULL && varname != NULL && varp != NULL) { -    /* set curbuf to be our buf, temporarily */ -    aucmd_prepbuf(&aco, buf); -      if (*varname == '&') {        long numval;        char_u      *strval; -      int error = FALSE; +      int error = false; +      aco_save_T  aco; + +      // set curbuf to be our buf, temporarily +      aucmd_prepbuf(&aco, buf);        ++varname;        numval = get_tv_number_chk(varp, &error);        strval = get_tv_string_buf_chk(varp, nbuf);        if (!error && strval != NULL)          set_option_value(varname, numval, strval, OPT_LOCAL); + +      // reset notion of buffer +      aucmd_restbuf(&aco);      } else { +      buf_T *save_curbuf = curbuf; +        bufvarname = xmalloc(STRLEN(varname) + 3); +      curbuf = buf;        STRCPY(bufvarname, "b:");        STRCPY(bufvarname + 2, varname);        set_var(bufvarname, varp, TRUE);        xfree(bufvarname); +      curbuf = save_curbuf;      } - -    /* reset notion of buffer */ -    aucmd_restbuf(&aco);    }  }  | 
