patch 7.4.2043
Problem:    setbuvfar() causes a screen redraw.
Solution:   Only use aucmd_prepbuf() for options.
diff --git a/src/eval.c b/src/eval.c
index 6987485..e29ba73 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -18495,7 +18495,6 @@
 f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
 {
     buf_T	*buf;
-    aco_save_T	aco;
     char_u	*varname, *bufvarname;
     typval_T	*varp;
     char_u	nbuf[NUMBUFLEN];
@@ -18509,35 +18508,40 @@
 
     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;
+	    aco_save_T	aco;
+
+	    /* set curbuf to be our buf, temporarily */
+	    aucmd_prepbuf(&aco, buf);
 
 	    ++varname;
 	    numval = (long)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 = alloc((unsigned)STRLEN(varname) + 3);
 	    if (bufvarname != NULL)
 	    {
+		curbuf = buf;
 		STRCPY(bufvarname, "b:");
 		STRCPY(bufvarname + 2, varname);
 		set_var(bufvarname, varp, TRUE);
 		vim_free(bufvarname);
+		curbuf = save_curbuf;
 	    }
 	}
-
-	/* reset notion of buffer */
-	aucmd_restbuf(&aco);
     }
 }