Index: nano.h
===================================================================
--- nano.h	(revision 4572)
+++ nano.h	(working copy)
@@ -530,6 +530,7 @@
 #define	MWHEREISFILE			(1<<11)
 #define MGOTODIR			(1<<12)
 #define MYESNO				(1<<13)
+#define MCOMMAND			(1<<14)
 /* This really isnt all but close enough */
 #define	MALL				(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MBROWSER|MWHEREISFILE|MGOTODIR|MHELP)
 
Index: global.c
===================================================================
--- global.c	(revision 4572)
+++ global.c	(working copy)
@@ -546,6 +546,8 @@
     const char *insert_file_msg =  N_("Insert File");
 #endif
     const char *go_to_line_msg = N_("Go To Line");
+    const char *command_mode_msg = N_("Command Mode");
+    const char *insert_mode_msg = N_("Insert Mode");
 
 #ifndef DISABLE_JUSTIFY
     const char *nano_justify_msg = N_("Justify the current paragraph");
@@ -693,6 +695,9 @@
     const char *nano_backfile_msg = N_("Go to the previous file in the list");
     const char *nano_gotodir_msg = N_("Go to directory");
 #endif
+    const char *nano_insert_mode_msg = N_("Switch to Insert Mode");
+    const char *nano_command_mode_msg = N_("Switch to Command Mode");
+    const char *nano_last_line_mode_msg = N_("Switch to Last Line Mode");
 #endif /* !DISABLE_HELP */
 
 #ifndef DISABLE_HELP
@@ -708,14 +713,14 @@
     }
 
     add_to_funcs(do_help_void,
-	(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MBROWSER|MWHEREISFILE|MGOTODIR),
+	(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MBROWSER|MWHEREISFILE|MGOTODIR|MCOMMAND),
 	get_help_msg, IFSCHELP(nano_help_msg), FALSE, VIEW);
 
     add_to_funcs( do_cancel,
 	(MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MWHEREISFILE|MGOTODIR|MYESNO),
 	cancel_msg, IFSCHELP(nano_cancel_msg), FALSE, VIEW);
 
-    add_to_funcs(do_exit, MMAIN,
+    add_to_funcs(do_exit, (MMAIN|MCOMMAND),
 #ifdef ENABLE_MULTIBUFFER
 	/* TRANSLATORS: Try to keep this at most 10 characters. */
 	openfile != NULL && openfile != openfile->next ? N_("Close") :
@@ -727,12 +732,12 @@
 #endif
 
     /* TRANSLATORS: Try to keep this at most 10 characters. */
-    add_to_funcs(do_writeout_void, MMAIN, N_("WriteOut"),
+    add_to_funcs(do_writeout_void, (MMAIN|MCOMMAND), N_("WriteOut"),
 	IFSCHELP(nano_writeout_msg), FALSE, NOVIEW);
 
 #ifndef DISABLE_JUSTIFY
     /* TRANSLATORS: Try to keep this at most 10 characters. */
-    add_to_funcs(do_justify_void, MMAIN, N_("Justify"),
+    add_to_funcs(do_justify_void, (MMAIN|MCOMMAND), N_("Justify"),
 	nano_justify_msg, TRUE, NOVIEW);
 #endif
 
@@ -751,7 +756,7 @@
 	NOVIEW);
 #endif
 
-    add_to_funcs(do_search, MMAIN|MBROWSER, whereis_msg,
+    add_to_funcs(do_search, MMAIN|MBROWSER|MCOMMAND, whereis_msg,
 	IFSCHELP(nano_whereis_msg), FALSE, VIEW);
 
     add_to_funcs(do_page_up, MMAIN|MHELP|MBROWSER,
@@ -761,7 +766,7 @@
 
 
     /* TRANSLATORS: Try to keep this at most 10 characters. */
-    add_to_funcs(do_cut_text_void, MMAIN, N_("Cut Text"), IFSCHELP(nano_cut_msg),
+    add_to_funcs(do_cut_text_void, (MMAIN|MCOMMAND), N_("Cut Text"), IFSCHELP(nano_cut_msg),
 	FALSE, NOVIEW);
 
     if (unjustify)
@@ -771,12 +776,12 @@
 
     else
 	/* TRANSLATORS: Try to keep this at most 10 characters. */
-	add_to_funcs(do_uncut_text, MMAIN, N_("UnCut Text"), IFSCHELP(nano_uncut_msg),
+	add_to_funcs(do_uncut_text, (MMAIN|MCOMMAND), N_("UnCut Text"), IFSCHELP(nano_uncut_msg),
 	    FALSE, NOVIEW);
 
 #ifndef NANO_TINY
     /* TRANSLATORS: Try to keep this at most 10 characters. */
-    add_to_funcs(do_cursorpos_void, MMAIN, N_("Cur Pos"), IFSCHELP(nano_cursorpos_msg),
+    add_to_funcs(do_cursorpos_void, (MMAIN|MCOMMAND), N_("Cur Pos"), IFSCHELP(nano_cursorpos_msg),
 	FALSE, VIEW);
 #endif
 
@@ -785,7 +790,7 @@
      * on the command line. */
 #ifndef DISABLE_SPELLER
 	/* TRANSLATORS: Try to keep this at most 10 characters. */
-	add_to_funcs(do_spell, MMAIN, N_("To Spell"), IFSCHELP(nano_spell_msg),
+	add_to_funcs(do_spell, (MMAIN|MCOMMAND), N_("To Spell"), IFSCHELP(nano_spell_msg),
 	    TRUE, NOVIEW);
 #endif
 
@@ -797,13 +802,12 @@
 	(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE),
 	last_line_msg, IFSCHELP(nano_lastline_msg), TRUE, VIEW);
 
-
     add_to_funcs(do_gotolinecolumn_void, (MMAIN|MWHEREIS),
 	go_to_line_msg, IFSCHELP(nano_gotoline_msg), FALSE, VIEW);
 
 #ifdef NANO_TINY
     /* TRANSLATORS: Try to keep this at most 10 characters. */
-    add_to_funcs(do_cursorpos_void, MMAIN, N_("Cur Pos"), IFSCHELP(nano_cursorpos_msg),
+    add_to_funcs(do_cursorpos_void, (MMAIN|MCOMMAND), N_("Cur Pos"), IFSCHELP(nano_cursorpos_msg),
 	FALSE, VIEW);
 #endif
 
@@ -844,7 +848,7 @@
 
 #endif
 
-    add_to_funcs(do_right, MMAIN, N_("Forward"), IFSCHELP(nano_forward_msg),
+    add_to_funcs(do_right, (MMAIN|MCOMMAND), N_("Forward"), IFSCHELP(nano_forward_msg),
 	FALSE, VIEW);
 
 #ifndef DISABLE_BROWSER
@@ -854,7 +858,7 @@
 
     add_to_funcs(do_right, MALL, "", "", FALSE, VIEW);
 
-    add_to_funcs(do_left, MMAIN, N_("Back"), IFSCHELP(nano_back_msg),
+    add_to_funcs(do_left, (MMAIN|MCOMMAND), N_("Back"), IFSCHELP(nano_back_msg),
 	FALSE, VIEW);
 
 #ifndef DISABLE_BROWSER
@@ -878,10 +882,10 @@
     add_to_funcs(do_down_void, (MMAIN|MHELP|MBROWSER), N_("Next Line"),
 	IFSCHELP(nano_nextline_msg), TRUE, VIEW);
 
-    add_to_funcs(do_home, MMAIN, N_("Home"), IFSCHELP(nano_home_msg),
+    add_to_funcs(do_home, (MMAIN|MCOMMAND), N_("Home"), IFSCHELP(nano_home_msg),
 	FALSE, VIEW);
 
-    add_to_funcs(do_end, MMAIN, N_("End"), IFSCHELP(nano_end_msg),
+    add_to_funcs(do_end, (MMAIN|MCOMMAND), N_("End"), IFSCHELP(nano_end_msg),
 	FALSE, VIEW);
 
 #ifndef DISABLE_JUSTIFY
@@ -1078,6 +1082,13 @@
 	goto_dir_msg, IFSCHELP(nano_gotodir_msg), FALSE, VIEW);
 #endif
 
+    add_to_funcs(do_command_mode, MMAIN, insert_mode_msg,
+	IFSCHELP(nano_command_mode_msg), FALSE, VIEW);
+
+    add_to_funcs(do_insert_mode, MCOMMAND, insert_mode_msg,
+	IFSCHELP(nano_insert_mode_msg), FALSE, VIEW);
+
+
     currmenu = MMAIN;
 
     add_to_sclist(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MBROWSER|MWHEREISFILE|MGOTODIR,
@@ -1085,36 +1096,46 @@
     add_to_sclist(MMAIN|MWHEREIS|MREPLACE|MREPLACE2|MGOTOLINE|MWRITEFILE|MINSERTFILE|MEXTCMD|MSPELL|MBROWSER|MWHEREISFILE|MGOTODIR,
 	"F1", do_help_void, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "^X", do_exit, 0, TRUE);
+    add_to_sclist(MCOMMAND, ":q", do_exit, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "F2", do_exit, 0, TRUE);
     add_to_sclist(MMAIN, "^_", do_gotolinecolumn_void, 0, TRUE);
     add_to_sclist(MMAIN, "F13", do_gotolinecolumn_void, 0, TRUE);
     add_to_sclist(MMAIN, "M-G", do_gotolinecolumn_void, 0, TRUE);
     add_to_sclist(MMAIN, "^O", do_writeout_void, 0, TRUE);
     add_to_sclist(MMAIN, "F3", do_writeout_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, ":w", do_writeout_void, 0, TRUE);
 #ifndef DISABLE_JUSTIFY
     add_to_sclist(MMAIN, "^J", do_justify_void, 0, TRUE);
     add_to_sclist(MMAIN, "F4", do_justify_void, 0, TRUE);
 #endif
     add_to_sclist(MMAIN, "^R", do_insertfile_void, 0, TRUE);
     add_to_sclist(MMAIN, "F5", do_insertfile_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, ":r", do_insertfile_void, 0, TRUE);
     add_to_sclist(MMAIN, "kinsert", do_insertfile_void, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER, "^W", do_search, 0, TRUE);
+    add_to_sclist(MCOMMAND, "/", do_search, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER, "F6", do_search, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "^Y", do_page_up, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "F7", do_page_up, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "kpup", do_page_up, 0, TRUE);
+    add_to_sclist(MCOMMAND, "^B", do_page_up, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "^V", do_page_down, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "F8", do_page_down, 0, TRUE);
     add_to_sclist(MMAIN|MBROWSER|MHELP|MWHEREISFILE, "kpdown", do_page_down, 0, TRUE);
+    add_to_sclist(MCOMMAND, "^F", do_page_down, 0, TRUE);
     add_to_sclist(MMAIN, "^K", do_cut_text_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, "d", do_cut_text_void, 0, TRUE);
     add_to_sclist(MMAIN, "F9", do_cut_text_void, 0, TRUE);
     add_to_sclist(MMAIN, "^U", do_uncut_text, 0, TRUE);
+    add_to_sclist(MCOMMAND, "p", do_uncut_text, 0, TRUE);
     add_to_sclist(MMAIN, "F10", do_uncut_text, 0, TRUE);
     add_to_sclist(MMAIN, "^C", do_cursorpos_void, 0, TRUE);
     add_to_sclist(MMAIN, "F11", do_cursorpos_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, "^G", do_cursorpos_void, 0, TRUE);
 #ifndef DISABLE_SPELLER
     add_to_sclist(MMAIN, "^T", do_spell, 0, TRUE);
     add_to_sclist(MMAIN, "F12", do_spell, 0, TRUE);
+    add_to_sclist(MMAIN, "WTF?", do_spell, 0, TRUE);
 #endif
     add_to_sclist(MMAIN, "^\\", do_replace, 0, TRUE);
     add_to_sclist(MMAIN, "F14", do_replace, 0, TRUE);
@@ -1143,12 +1164,18 @@
 #endif
     add_to_sclist(MALL, "kright", do_right, 0, TRUE);
     add_to_sclist(MALL, "kleft", do_left, 0, TRUE);
+    add_to_sclist(MCOMMAND, "l", do_right, 0, TRUE);
+    add_to_sclist(MCOMMAND, "h", do_left, 0, TRUE);
     add_to_sclist(MMAIN, "^Q", xon_complaint, 0, TRUE);
     add_to_sclist(MMAIN, "^S", xoff_complaint, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "^P", do_up_void, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "kup", do_up_void, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "^N", do_down_void, 0, TRUE);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "kdown", do_down_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, "j", do_down_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, "k", do_up_void, 0, TRUE);
+    add_to_sclist(MCOMMAND, "^", do_home, 0, TRUE);
+    add_to_sclist(MCOMMAND, "$", do_end, 0, TRUE);
     add_to_sclist(MALL, "^A", do_home, 0, TRUE);
     add_to_sclist(MALL, "khome", do_home, 0, TRUE);
     add_to_sclist(MALL, "^E", do_end, 0, TRUE);
@@ -1253,6 +1280,11 @@
     add_to_sclist(MINSERTFILE, "^X",  ext_cmd_void, 0, FALSE);
     add_to_sclist(MMAIN, "^Z", do_suspend_void, 0, FALSE);
     add_to_sclist(MMAIN, "^L", total_refresh, 0, TRUE);
+    add_to_sclist(MCOMMAND, "i", do_insert_mode, 0, TRUE);
+    add_to_sclist(MCOMMAND, "a", do_insert_mode, 0, TRUE);
+    add_to_sclist(MMAIN, "M-Q", do_command_mode, 0, TRUE);
+    add_to_sclist(MCOMMAND, "h", do_left, 0, TRUE);
+
     add_to_sclist(MALL, "^I", do_tab, 0, TRUE);
     add_to_sclist(MALL, "^M", do_enter_void, 0, TRUE);
     add_to_sclist(MALL, "kenter", do_enter_void, 0, TRUE);
Index: proto.h
===================================================================
--- proto.h	(revision 4572)
+++ proto.h	(working copy)
@@ -863,6 +863,8 @@
 void goto_dir_void(void);
 void no_replace_void(void);
 void ext_cmd_void(void);
+void do_insert_mode(void);
+void do_command_mode(void);
 
 
 #endif /* !PROTO_H */
Index: winio.c
===================================================================
--- winio.c	(revision 4572)
+++ winio.c	(working copy)
@@ -349,7 +349,9 @@
 	    escapes++;
 	    switch (escapes) {
 		case 1:
-		    /* One escape: wait for more input. */
+		    /* One escape: Go to command mode */
+		    do_command_mode();
+		    break;
 		case 2:
 		    /* Two escapes: wait for more input. */
 		case 3:
Index: nano.c
===================================================================
--- nano.c	(revision 4572)
+++ nano.c	(working copy)
@@ -1352,6 +1352,21 @@
 }
 #endif /* !NANO_TINY */
 
+void do_command_mode(void)
+{
+    currmenu = MCOMMAND;
+    bottombars(currmenu);
+    return;
+}
+
+void do_insert_mode(void)
+{
+    currmenu = MMAIN;
+    bottombars(currmenu);
+    return;
+}
+
+
 #ifndef NANO_TINY
 /* Handle the global toggle specified in which. */
 void do_toggle(int flag)
@@ -1562,7 +1577,7 @@
 #endif
 
     /* Check for a shortcut in the main list. */
-    s = get_shortcut(MMAIN, &input, meta_key, func_key);
+    s = get_shortcut(currmenu, &input, meta_key, func_key);
 
     /* If we got a shortcut from the main list, or a "universal"
      * edit window shortcut, set have_shortcut to TRUE. */
@@ -2735,7 +2750,8 @@
 	if (ISSET(CONST_UPDATE) && get_key_buffer_len() == 0)
 	    do_cursorpos(TRUE);
 
-        currmenu = MMAIN;
+	if (currmenu != MCOMMAND)
+	    currmenu = MMAIN;
 
 	/* Read in and interpret characters. */
 	do_input(&meta_key, &func_key, &s_or_t, &ran_func, &finished,
