patch 8.2.3227: 'virtualedit' can only be set globally

Problem:    'virtualedit' can only be set globally.
Solution:   Make 'virtualedit' global-local. (Gary Johnson, closes #8638)
diff --git a/src/ops.c b/src/ops.c
index 59d5bff..75619c5 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -1474,18 +1474,22 @@
 	// doing block_prep().  When only "block" is used, virtual edit is
 	// already disabled, but still need it when calling
 	// coladvance_force().
+	// coladvance_force() uses get_ve_flags() to get the 'virtualedit'
+	// state for the current buffer.  To override that state, we need to
+	// set the buffer-local value of ve_flags rather than the global value.
 	if (curwin->w_cursor.coladd > 0)
 	{
-	    int		old_ve_flags = ve_flags;
+	    int		old_ve_flags = curbuf->b_ve_flags;
 
-	    ve_flags = VE_ALL;
 	    if (u_save_cursor() == FAIL)
 		return;
+
+	    curbuf->b_ve_flags = VE_ALL;
 	    coladvance_force(oap->op_type == OP_APPEND
 					   ? oap->end_vcol + 1 : getviscol());
 	    if (oap->op_type == OP_APPEND)
 		--curwin->w_cursor.col;
-	    ve_flags = old_ve_flags;
+	    curbuf->b_ve_flags = old_ve_flags;
 	}
 	// Get the info about the block before entering the text
 	block_prep(oap, &bd, oap->start.lnum, TRUE);
@@ -1816,15 +1820,17 @@
     void
 adjust_cursor_eol(void)
 {
+    unsigned int cur_ve_flags = get_ve_flags();
+
     if (curwin->w_cursor.col > 0
 	    && gchar_cursor() == NUL
-	    && (ve_flags & VE_ONEMORE) == 0
+	    && (cur_ve_flags & VE_ONEMORE) == 0
 	    && !(restart_edit || (State & INSERT)))
     {
 	// Put the cursor on the last character in the line.
 	dec_cursor();
 
-	if (ve_flags == VE_ALL)
+	if (cur_ve_flags == VE_ALL)
 	{
 	    colnr_T	    scol, ecol;