patch 8.2.4692: no test for what 8.2.4691 fixes

Problem:    No test for what 8.2.4691 fixes.
Solution:   Add a test.  Use a more generic sotlution. (closes #10090)
diff --git a/src/getchar.c b/src/getchar.c
index 34a33ac..b81f64a 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1419,6 +1419,14 @@
 static int old_mod_mask;	// mod_mask for ungotten character
 static int old_mouse_row;	// mouse_row related to old_char
 static int old_mouse_col;	// mouse_col related to old_char
+static int old_KeyStuffed;	// whether old_char was stuffed
+
+static int can_get_old_char()
+{
+    // If the old character was not stuffed and characters have been added to
+    // the stuff buffer, need to first get the stuffed characters instead.
+    return old_char != -1 && (old_KeyStuffed || stuff_empty());
+}
 
 /*
  * Save all three kinds of typeahead, so that the user must type at a prompt.
@@ -1687,7 +1695,7 @@
      * If a character was put back with vungetc, it was already processed.
      * Return it directly.
      */
-    if (old_char != -1)
+    if (can_get_old_char())
     {
 	c = old_char;
 	old_char = -1;
@@ -1987,7 +1995,7 @@
     int
 vpeekc(void)
 {
-    if (old_char != -1)
+    if (can_get_old_char())
 	return old_char;
     return vgetorpeek(FALSE);
 }
@@ -2942,6 +2950,8 @@
 
 /*
  * unget one character (can only be done once!)
+ * If the character was stuffed, vgetc() will get it next time it was called.
+ * Otherwise vgetc() will only get it when the stuff buffer is empty.
  */
     void
 vungetc(int c)
@@ -2950,6 +2960,7 @@
     old_mod_mask = mod_mask;
     old_mouse_row = mouse_row;
     old_mouse_col = mouse_col;
+    old_KeyStuffed = KeyStuffed;
 }
 
 /*
@@ -3755,8 +3766,6 @@
     int		c2;
     int		cmod = 0;
     int		aborted = FALSE;
-    int		first = TRUE;
-    int		got_ctrl_o = FALSE;
 
     ga_init2(&line_ga, 1, 32);
 
@@ -3784,15 +3793,6 @@
 	// Get one character at a time.
 	c1 = vgetorpeek(TRUE);
 
-	// do not use Ctrl_O at the start, stuff it back later
-	if (first && c1 == Ctrl_O)
-	{
-	    got_ctrl_o = TRUE;
-	    first = FALSE;
-	    continue;
-	}
-	first = FALSE;
-
 	// Get two extra bytes for special keys
 	if (c1 == K_SPECIAL)
 	{
@@ -3844,8 +3844,6 @@
     }
 
     no_mapping--;
-    if (got_ctrl_o)
-	stuffcharReadbuff(Ctrl_O);
 
     if (aborted)
 	ga_clear(&line_ga);