diff --git a/src/global.c b/src/global.c index b2f837e..8055ad7 100644 --- a/src/global.c +++ b/src/global.c @@ -1135,6 +1135,7 @@ void shortcut_init(bool unjustify) #ifndef DISABLE_JUSTIFY add_to_sclist(MALL, "M-J", do_full_justify, 0, TRUE); #endif + add_to_sclist(MMAIN, "M-1", do_toggle, VIEW_MODE, TRUE); add_to_sclist(MMAIN, "M-D", do_wordlinechar_count, 0, TRUE); add_to_sclist(MMAIN, "M-X", do_toggle, NO_HELP, TRUE); add_to_sclist(MMAIN, "M-C", do_toggle, CONST_UPDATE, TRUE); @@ -1211,6 +1212,8 @@ const subnfunc *sctofunc(sc *s) char *flagtostr(int flag) { switch (flag) { + case VIEW_MODE: + return N_("View mode"); case NO_HELP: return N_("Help mode"); case CONST_UPDATE: @@ -1379,6 +1382,10 @@ sc *strtosc(int menu, char *input) s->scfunc = (void *) do_toggle; s->execute = FALSE; s->toggle = AUTOINDENT; + } else if (!strcasecmp(input, "view_mode")) { + s->scfunc = (void *) do_toggle; + s->execute = FALSE; + s->toggle = VIEW_MODE; } else if (!strcasecmp(input, "cuttoend")) { s->scfunc = (void *) do_toggle; s->execute = FALSE; diff --git a/src/nano.c b/src/nano.c index 0a017dd..a7fa9e7 100644 --- a/src/nano.c +++ b/src/nano.c @@ -572,6 +572,58 @@ void print_view_warning(void) { statusbar(_("Key invalid in view mode")); } +/* handle keypress in view mode for pager commands + and displey warning for any other keypress */ +void view_mode_keypress(int input) +{ + switch(input){ + case '/': /* search */ + UNSET(BACKWARDS_SEARCH); + do_search(); + break; + case 'n': /* find next match */ + UNSET(BACKWARDS_SEARCH); + do_research(); + break; + case 'N': /* find previous match */ + SET(BACKWARDS_SEARCH); + do_research(); + break; + case 'q': /* quit */ + do_exit(); + break; + case 'g': /* go to first line */ + do_first_line(); + statusbar(_("First line")); + break; + case 'G': /* go to last line */ + do_last_line(); + statusbar(_("Last line")); + break; + case ' ': /* page down */ + do_page_down(); + statusbar(_("Next page")); + break; + case 'b': /* page up */ + do_page_up(); + statusbar(_("Previous page")); + break; + case 'h': /* cursor left */ + do_left(); + break; + case 'j': /* cursor down */ + do_down_void(); + break; + case 'k': /* cursor up */ + do_up_void(); + break; + case 'l': /* cursor right */ + do_right(); + break; + default: + statusbar(_("Key invalid in view mode")); + } +} /* Make nano exit gracefully. */ void finish(void) @@ -1216,6 +1268,10 @@ void do_toggle(int flag) TOGGLE(flag); + if (flag == VIEW_MODE){ + titlebar(NULL); + } + switch (flag) { #ifndef DISABLE_MOUSE case USE_MOUSE: @@ -1433,7 +1489,7 @@ int do_input(bool *meta_key, bool *func_key, bool *s_or_t, bool * we're not. */ if (input != ERR && !have_shortcut) { if (ISSET(VIEW_MODE)) - print_view_warning(); + view_mode_keypress(input); else { kbinput_len++; kbinput = (int *)nrealloc(kbinput, kbinput_len * diff --git a/src/nano.h b/src/nano.h index 04f0023..4a6e63b 100644 --- a/src/nano.h +++ b/src/nano.h @@ -547,6 +547,7 @@ typedef struct subnfunc { #define NANO_META_X 'x' #define NANO_META_Y 'y' #define NANO_META_Z 'z' +#define NANO_META_1 '1' #define NANO_META_LCURLYBRACKET '{' #define NANO_META_PIPE '|' #define NANO_META_RCURLYBRACKET '}' @@ -691,6 +692,7 @@ typedef struct subnfunc { #define TOGGLE_BACKWARDS_KEY NANO_META_B #define TOGGLE_DOS_KEY NANO_META_D #define TOGGLE_MAC_KEY NANO_META_M +#define TOGGLE_VIEW_MODE NANO_META_1 /* Extra bits for the undo function */ #define UNDO_DEL_DEL (1<<0) diff --git a/src/winio.c b/src/winio.c index 9660f79..51e3d37 100644 --- a/src/winio.c +++ b/src/winio.c @@ -2112,8 +2112,14 @@ void titlebar(const char *path) state = ""; else #endif - state = openfile->modified ? _("Modified") : ISSET(VIEW_MODE) ? - _("View") : ""; + /* statusbar should show View in view mode + * or View* if file is modified */ + if(openfile->modified) + if(ISSET(VIEW_MODE)) state = _("View*"); + else state = _("Modified"); + else + if(ISSET(VIEW_MODE)) state = _("View"); + else state = ""; statelen = strlenpt((*state == '\0' && path == NULL) ? _("Modified") : state);