fix recurring "last_cmd overrun", fix [del] handling in insert mode

diff --git a/editors/vi.c b/editors/vi.c
index a01fa7c..55dab1f 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -96,6 +96,12 @@
 static const char CMup[] ALIGN1 = "\033[A";
 static const char CMdown[] ALIGN1 = "\n";
 
+#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
+// cmds modifying text[]
+// vda: removed "aAiIs" as they switch us into insert mode
+// and remembering input for replay after them makes no sense
+static const char modifying_cmds[] = "cCdDJoOpPrRxX<>~";
+#endif
 
 enum {
 	YANKONLY = FALSE,
@@ -180,9 +186,6 @@
 #if ENABLE_FEATURE_VI_USE_SIGNALS || ENABLE_FEATURE_VI_CRASHME
 	int my_pid;
 #endif
-#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
-	char *modifying_cmds;    // cmds that modify text[]
-#endif
 #if ENABLE_FEATURE_VI_SEARCH
 	char *last_search_pattern; // last pattern from a '/' or '?' search
 #endif
@@ -266,7 +269,6 @@
 #define ioq_start               (G.ioq_start          )
 #define last_row                (G.last_row           )
 #define my_pid                  (G.my_pid             )
-#define modifying_cmds          (G.modifying_cmds     )
 #define last_search_pattern     (G.last_search_pattern)
 #define chars_to_parse          (G.chars_to_parse     )
 
@@ -429,10 +431,6 @@
 #endif
 
 	vi_setops = VI_AUTOINDENT | VI_SHOWMATCH | VI_IGNORECASE;
-#if ENABLE_FEATURE_VI_DOT_CMD || ENABLE_FEATURE_VI_YANKMARK
-	modifying_cmds = (char *) "aAcCdDiIJoOpPrRsxX<>~";	// cmds modifying text[]
-#endif
-
 	//  1-  process $HOME/.exrc file (not inplemented yet)
 	//  2-  process EXINIT variable from environment
 	//  3-  process command line args
@@ -624,6 +622,7 @@
 		// These are commands that change text[].
 		// Remember the input for the "." command
 		if (!adding2q && ioq_start == NULL
+		 && cmd_mode == 0 /* command mode */
 		 && c != '\0' && strchr(modifying_cmds, c)
 		) {
 			start_new_cmd_q(c);
@@ -2200,12 +2199,12 @@
 	// Known escape sequences for cursor and function keys.
 	static const struct esc_cmds {
 		const char seq[4];
-		char val;
+		char val; //TODO: int? Need to make it at least 8-bit clean!
 	} esccmds[] = {
-		{"OA"  , VI_K_UP      },   // cursor key Up
-		{"OB"  , VI_K_DOWN    },   // cursor key Down
+		{"OA"  , VI_K_UP      },   // Cursor Key Up
+		{"OB"  , VI_K_DOWN    },   // Cursor Key Down
 		{"OC"  , VI_K_RIGHT   },   // Cursor Key Right
-		{"OD"  , VI_K_LEFT    },   // cursor key Left
+		{"OD"  , VI_K_LEFT    },   // Cursor Key Left
 		{"OH"  , VI_K_HOME    },   // Cursor Key Home
 		{"OF"  , VI_K_END     },   // Cursor Key End
 		{"OP"  , VI_K_FUN1    },   // Function Key F1
@@ -2213,10 +2212,10 @@
 		{"OR"  , VI_K_FUN3    },   // Function Key F3
 		{"OS"  , VI_K_FUN4    },   // Function Key F4
 
-		{"[A"  , VI_K_UP      },   // cursor key Up
-		{"[B"  , VI_K_DOWN    },   // cursor key Down
+		{"[A"  , VI_K_UP      },   // Cursor Key Up
+		{"[B"  , VI_K_DOWN    },   // Cursor Key Down
 		{"[C"  , VI_K_RIGHT   },   // Cursor Key Right
-		{"[D"  , VI_K_LEFT    },   // cursor key Left
+		{"[D"  , VI_K_LEFT    },   // Cursor Key Left
 		{"[H"  , VI_K_HOME    },   // Cursor Key Home
 		{"[F"  , VI_K_END     },   // Cursor Key End
 		{"[1~" , VI_K_HOME    },   // Cursor Key Home
@@ -3003,6 +3002,7 @@
 		case VI_K_END:
 		case VI_K_PAGEUP:
 		case VI_K_PAGEDOWN:
+		case VI_K_DELETE:
 			goto key_cmd_mode;
 	}