From d679bbc802738205721e319ddfe093c78693baa7 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sat, 19 Sep 2020 19:50:45 +0200 Subject: [PATCH] new feature: option --stateflags to show some states in top-right corner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With --stateflags (short form: -%) or 'set stateflags', nano reserves the righthand end of the title bar not for showing "Modified" but for showing the state of auto-indentation (I), the mark (M), the breaking of long lines (L), macro recording (R), and softwrapping (S). When the buffer is modified, this is indicated with a star (*) after the file name (shown in the center of the title bar). This fulfills https://savannah.gnu.org/bugs/?57953. Requested-by: Sébastien Desreux --- src/definitions.h | 3 ++- src/nano.c | 17 ++++++++++++++++- src/rcfile.c | 1 + src/winio.c | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/definitions.h b/src/definitions.h index 8e9f3db6..4b593624 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -541,7 +541,8 @@ enum JUMPY_SCROLLING, EMPTY_LINE, INDICATOR, - BOOKSTYLE + BOOKSTYLE, + STATEFLAGS }; /* Flags for the menus in which a given function should be present. */ diff --git a/src/nano.c b/src/nano.c index c887b51e..49ef3775 100644 --- a/src/nano.c +++ b/src/nano.c @@ -497,6 +497,7 @@ void usage(void) #ifndef NANO_TINY /* TRANSLATORS: The next forty or so strings are option descriptions * for the --help output. Try to keep them at most 40 characters. */ + print_opt("-%", "--stateflags", N_("Show some states on the title bar")); print_opt("-A", "--smarthome", N_("Enable smart home key")); if (!ISSET(RESTRICTED)) { print_opt("-B", "--backup", N_("Save backups of existing files")); @@ -1113,6 +1114,10 @@ void do_toggle(int flag) #endif } + if (ISSET(STATEFLAGS) && (flag == AUTOINDENT || + flag == BREAK_LONG_LINES || flag == SOFTWRAP)) + titlebar(NULL); + enabled = ISSET(flag); if (flag == NO_HELP || flag == NO_SYNTAX) @@ -1528,6 +1533,9 @@ void process_a_keystroke(void) /* The input buffer for actual characters. */ static size_t depth = 0; /* The length of the input buffer. */ +#ifndef NANO_TINY + linestruct *was_mark = openfile->mark; +#endif static bool give_a_hint = TRUE; const keystruct *shortcut; @@ -1667,6 +1675,9 @@ void process_a_keystroke(void) #ifndef NANO_TINY if (bracketed_paste) suck_up_input_and_paste_it(); + + if (ISSET(STATEFLAGS) && openfile->mark != was_mark) + titlebar(NULL); #endif } @@ -1750,6 +1761,7 @@ int main(int argc, char **argv) {"nohelp", 0, NULL, 'x'}, {"suspendable", 0, NULL, 'z'}, #ifndef NANO_TINY + {"stateflags", 0, NULL, '%'}, {"smarthome", 0, NULL, 'A'}, {"backup", 0, NULL, 'B'}, {"backupdir", 1, NULL, 'C'}, @@ -1829,10 +1841,13 @@ int main(int argc, char **argv) if (*(tail(argv[0])) == 'r') SET(RESTRICTED); - while ((optchr = getopt_long(argc, argv, "ABC:DEFGHIJ:KLMNOPQ:RST:UVWX:Y:Z" + while ((optchr = getopt_long(argc, argv, "%ABC:DEFGHIJ:KLMNOPQ:RST:UVWX:Y:Z" "abcdef:ghijklmno:pqr:s:tuvwxyz$", long_options, NULL)) != -1) { switch (optchr) { #ifndef NANO_TINY + case '%': + SET(STATEFLAGS); + break; case 'A': SET(SMART_HOME); break; diff --git a/src/rcfile.c b/src/rcfile.c index c3781f76..5d69d374 100644 --- a/src/rcfile.c +++ b/src/rcfile.c @@ -114,6 +114,7 @@ static const rcoption rcopts[] = { {"smarthome", SMART_HOME}, {"smooth", SMOOTH_SCROLL}, /* Deprecated; remove in 2021. */ {"softwrap", SOFTWRAP}, + {"stateflags", STATEFLAGS}, {"tabstospaces", TABS_TO_SPACES}, {"trimblanks", TRIM_BLANKS}, {"unix", MAKE_IT_UNIX}, diff --git a/src/winio.c b/src/winio.c index 3ec15201..8f47609f 100644 --- a/src/winio.c +++ b/src/winio.c @@ -97,6 +97,9 @@ void record_macro(void) snip_last_keystroke(); statusbar(_("Stopped recording")); } + + if (ISSET(STATEFLAGS)) + titlebar(NULL); } /* Copy the stored sequence of codes into the regular key buffer, @@ -1973,6 +1976,9 @@ void titlebar(const char *path) else path = openfile->filename; + if (ISSET(STATEFLAGS) && !ISSET(VIEW_MODE)) + state = "+.xxxxx"; + else if (openfile->modified) state = _("Modified"); else if (ISSET(VIEW_MODE)) @@ -2036,11 +2042,26 @@ void titlebar(const char *path) free(caption); } + /* When requested, show on the title bar the state of three options and + * the state of the mark and whether a macro is being recorded. */ + if (ISSET(STATEFLAGS) && !ISSET(VIEW_MODE)) { + if (COLS > 1) + waddstr(topwin, openfile->modified ? " *" : " "); + if (statelen < COLS) { + wmove(topwin, 0, COLS + 2 - statelen); + waddstr(topwin, ISSET(AUTOINDENT) ? "I" : " "); + waddstr(topwin, openfile->mark ? "M" : " "); + waddstr(topwin, ISSET(BREAK_LONG_LINES) ? "L" : " "); + waddstr(topwin, recording ? "R" : " "); + waddstr(topwin, ISSET(SOFTWRAP) ? "S" : " "); + } + } else { /* Right-align the state if there's room; otherwise, trim it. */ if (statelen > 0 && statelen <= COLS) mvwaddstr(topwin, 0, COLS - statelen, state); else if (statelen > 0) mvwaddnstr(topwin, 0, 0, state, actual_x(state, COLS)); + } wattroff(topwin, interface_color_pair[TITLE_BAR]);