fix recurring "last_cmd overrun", fix [del] handling in insert mode
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 14 Oct 2008 12:26:30 +0000 (12:26 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 14 Oct 2008 12:26:30 +0000 (12:26 -0000)
editors/vi.c

index a01fa7c46328b1eb08728edc701445b242fabaea..55dab1f03ed9b7d49dbdc844e5bd1194ef1c4ea4 100644 (file)
@@ -96,6 +96,12 @@ static const char CMrc[] ALIGN1 = "\033[%d;%dH";
 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 @@ struct globals {
 #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 @@ struct globals {
 #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 @@ int vi_main(int argc, char **argv)
 #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 @@ static void edit_file(char *fn)
                // 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 @@ static char readit(void)        // read (maybe cursor) key from stdin
        // 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 @@ static char readit(void)        // read (maybe cursor) key from stdin
                {"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 @@ static void do_cmd(char c)
                case VI_K_END:
                case VI_K_PAGEUP:
                case VI_K_PAGEDOWN:
+               case VI_K_DELETE:
                        goto key_cmd_mode;
        }