nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 18b37c980abba6cdc1bb7312fab007c385062839
parent 64ac4610de686589fbdc99dafd3a649897d6ac41
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Fri, 17 Feb 2023 12:34:04 +0100

new feature: option --modernbindings sets up more widespread key bindings

With --modernbindings, ^Q quits, ^F finds, ^B finds backwards, ^G finds
again, ^D finds again backwards, ^X cuts, ^C copies, ^V pastes, ^A sets
the mark, ^R replaces, ^O opens a file, ^W writes out a file, ^S saves,
^Z undoes, ^Y redoes, ^P shows the position, ^T goes to a given line,
and ^E executes.

Note that with --modernbindings ^Q and ^S are always bound, meaning that
--preserve / 'set preserve' is ignored.  This is necessary because ^Q is
an essential keystroke in the modern bindings.

Also note that these "modern bindings" are effective only in the main
edit window, not in the various menus.  In all menus ^C means Cancel,
and I can't think of a good alternative default keystroke for that
(in order for ^C to mean Copy).  And in a few menus ^V has a meaning,
and there is no good alternative for that either.  So... in the menus
the user has to use M-6 for Copy and ^U for Paste (and ^K for Erase --
Cut does not exist in the menus), like with the default bindings.

Diffstat:
Msrc/definitions.h | 3++-
Msrc/global.c | 47++++++++++++++++++++++++++++++++++-------------
Msrc/nano.c | 7++++++-
3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/src/definitions.h b/src/definitions.h @@ -374,7 +374,8 @@ enum { STATEFLAGS, USE_MAGIC, MINIBAR, - ZERO + ZERO, + MODERN_BINDINGS }; /* Structure types. */ diff --git a/src/global.c b/src/global.c @@ -1171,33 +1171,61 @@ void shortcut_init(void) add_to_sclist(MMOST, "^H", '\b', do_backspace, 0); add_to_sclist(MMOST, "Bsp", KEY_BACKSPACE, do_backspace, 0); add_to_sclist(MMOST, "Sh-Del", SHIFT_DELETE, do_backspace, 0); - add_to_sclist(MMOST, "^D", 0, do_delete, 0); add_to_sclist(MMOST, "Del", KEY_DC, do_delete, 0); add_to_sclist(MMOST, "^I", '\t', do_tab, 0); add_to_sclist(MMOST, "Tab", '\t', do_tab, 0); + if (ISSET(MODERN_BINDINGS)) { + add_to_sclist((MMOST|MBROWSER) & ~MFINDINHELP, "^N", 0, do_help, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^Q", 0, do_exit, 0); + add_to_sclist(MMAIN, "^S", 0, do_savefile, 0); + add_to_sclist(MMAIN, "^W", 0, do_writeout, 0); + add_to_sclist(MMAIN, "^O", 0, do_insertfile, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^D", 0, do_findprevious, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^G", 0, do_findnext, 0); + add_to_sclist(MMAIN, "^R", 0, do_replace, 0); + add_to_sclist(MMAIN, "^T", 0, do_gotolinecolumn, 0); + add_to_sclist(MMAIN, "^P", 0, report_cursor_position, 0); +#ifndef NANO_TINY + add_to_sclist(MMAIN, "^Z", 0, do_undo, 0); + add_to_sclist(MMAIN, "^Y", 0, do_redo, 0); + add_to_sclist(MMAIN, "^A", 0, do_mark, 0); + add_to_sclist(MMAIN, "^C", 0, copy_text, 0); +#endif + add_to_sclist(MMAIN, "^X", 0, cut_text, 0); + add_to_sclist(MMAIN, "^V", 0, paste_text, 0); + } else { add_to_sclist((MMOST|MBROWSER) & ~MFINDINHELP, "^G", 0, do_help, 0); add_to_sclist(MMAIN|MBROWSER|MHELP, "^X", 0, do_exit, 0); if (!ISSET(PRESERVE)) add_to_sclist(MMAIN, "^S", 0, do_savefile, 0); add_to_sclist(MMAIN, "^O", 0, do_writeout, 0); add_to_sclist(MMAIN, "^R", 0, do_insertfile, 0); - add_to_sclist(MMAIN, "Ins", KEY_IC, do_insertfile, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP, "^B", 0, do_search_backward, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP, "^F", 0, do_search_forward, 0); if (!ISSET(PRESERVE)) add_to_sclist(MMAIN|MBROWSER|MHELP, "^Q", 0, do_search_backward, 0); add_to_sclist(MMAIN|MBROWSER|MHELP, "^W", 0, do_search_forward, 0); + add_to_sclist(MMOST, "^A", 0, do_home, 0); + add_to_sclist(MMOST, "^E", 0, do_end, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^P", 0, do_up, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^N", 0, do_down, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^Y", 0, do_page_up, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^V", 0, do_page_down, 0); + add_to_sclist(MMAIN, "^C", 0, report_cursor_position, 0); + add_to_sclist(MMOST, "^D", 0, do_delete, 0); + } + add_to_sclist(MMAIN, "Ins", KEY_IC, do_insertfile, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^B", 0, do_search_backward, 0); + add_to_sclist(MMAIN|MBROWSER|MHELP, "^F", 0, do_search_forward, 0); add_to_sclist(MMAIN, "^\\", 0, do_replace, 0); add_to_sclist(MMAIN, "M-R", 0, do_replace, 0); add_to_sclist(MMOST, "^K", 0, cut_text, 0); #ifdef NANO_TINY add_to_sclist(MMAIN, "^U", 0, paste_text, 0); #ifdef ENABLE_SPELLER - add_to_sclist(MMAIN, "^T", 0, do_spell, 0); + add_to_sclist(MMAIN, ISSET(MODERN_BINDINGS) ? "^E" : "^T", 0, do_spell, 0); #endif #else add_to_sclist(MMOST, "^U", 0, paste_text, 0); - add_to_sclist(MMAIN, "^T", 0, do_execute, 0); + add_to_sclist(MMAIN, ISSET(MODERN_BINDINGS) ? "^E" : "^T", 0, do_execute, 0); #ifdef ENABLE_SPELLER if (!ISSET(PRESERVE)) add_to_sclist(MEXECUTE, "^S", 0, do_spell, 0); @@ -1213,13 +1241,10 @@ void shortcut_init(void) #ifdef ENABLE_FORMATTER add_to_sclist(MEXECUTE, "^O", 0, do_formatter, 0); #endif - add_to_sclist(MMAIN, "^C", 0, report_cursor_position, 0); add_to_sclist(MMAIN, SLASH_OR_DASH, 0, do_gotolinecolumn, 0); add_to_sclist(MMAIN, "M-G", 0, do_gotolinecolumn, 0); add_to_sclist(MMAIN, "^_", 0, do_gotolinecolumn, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^Y", 0, do_page_up, 0); add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "PgUp", KEY_PPAGE, do_page_up, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "^V", 0, do_page_down, 0); add_to_sclist(MMAIN|MBROWSER|MHELP|MLINTER, "PgDn", KEY_NPAGE, do_page_down, 0); add_to_sclist(MBROWSER|MHELP, "Bsp", KEY_BACKSPACE, do_page_up, 0); add_to_sclist(MBROWSER|MHELP, "Sh-Del", SHIFT_DELETE, do_page_up, 0); @@ -1298,12 +1323,8 @@ void shortcut_init(void) } add_to_sclist(MMOST, "M-Space", 0, to_prev_word, 0); add_to_sclist(MMOST, "^Space", 0, to_next_word, 0); - add_to_sclist(MMOST, "^A", 0, do_home, 0); add_to_sclist(MMOST, "Home", KEY_HOME, do_home, 0); - add_to_sclist(MMOST, "^E", 0, do_end, 0); add_to_sclist(MMOST, "End", KEY_END, do_end, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP, "^P", 0, do_up, 0); - add_to_sclist(MMAIN|MBROWSER|MHELP, "^N", 0, do_down, 0); #ifdef ENABLE_UTF8 if (using_utf8()) { add_to_sclist(MMAIN|MBROWSER|MHELP, "\xE2\x96\xb4", KEY_UP, do_up, 0); diff --git a/src/nano.c b/src/nano.c @@ -660,6 +660,7 @@ void usage(void) print_opt("-_", "--minibar", N_("Show a feedback bar at the bottom")); print_opt("-0", "--zero", N_("Hide all bars, use whole terminal")); #endif + print_opt("-/", "--modernbindings", N_("Use better-known key bindings")); } /* Display the version number of this nano, a copyright notice, some contact @@ -1778,6 +1779,7 @@ int main(int argc, char **argv) {"nowrap", 0, NULL, 'w'}, #endif {"nohelp", 0, NULL, 'x'}, + {"modernbindings", 0, NULL, '/'}, #ifndef NANO_TINY {"smarthome", 0, NULL, 'A'}, {"backup", 0, NULL, 'B'}, @@ -1853,7 +1855,7 @@ int main(int argc, char **argv) SET(RESTRICTED); while ((optchr = getopt_long(argc, argv, "ABC:DEFGHIJ:KLMNOPQ:RS$T:UVWX:Y:Z" - "abcdef:ghijklmno:pqr:s:tuvwxy!%_0", long_options, NULL)) != -1) { + "abcdef:ghijklmno:pqr:s:tuvwxy!%_0/", long_options, NULL)) != -1) { switch (optchr) { #ifndef NANO_TINY case 'A': @@ -2102,6 +2104,9 @@ int main(int argc, char **argv) SET(ZERO); break; #endif + case '/': + SET(MODERN_BINDINGS); + break; default: printf(_("Type '%s -h' for a list of available options.\n"), argv[0]); exit(1);