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,