diff --git a/ChangeLog b/ChangeLog index 62adf7f9566983bebae8c280d990106e2b98210c..a0e0d2052d13662c0f1003e31b58e3746b462772 100644 --- a/ChangeLog +++ b/ChangeLog @@ -39,6 +39,11 @@ CVS code - edit_update(), rename open_the_file() to open_file() since the latter has been removed, and rename load_a_file() to load_buffer(). + - Add alternative shortcuts for moving to the beginning and end + of a paragraph and justifying the entire file: Meta-( + (Meta-9), Meta-) (Meta-0), and Meta-J, respectively. Also add + these functions to the main shortcut list, as Pico's practice + of putting them in the search menu is rather odd. (DLR) - files.c: do_insertfile() - Readd the NANO_SMALL #ifdef around the start_again: label to @@ -50,6 +55,14 @@ CVS code - die_save_file() - Clarify the error message when there are too many backup files and the current one can't be written. (DLR) + help_init() + - Rework to be a bit more flexible. Only add tabs for shortcut + key entries if those entries exist, and if there's only one + entry left but there's room for more than one, add enough tabs + to put that entry at the end. These changes allow e.g. the + miscellaneous meta key sequence to be displayed in a shortcut + that has a control key, a primary meta key sequence, and a + miscellaneous meta key sequence, but no function key. (DLR) justify_format() - For more compatibility with Pico, remove extra space after a character in punct if that character is the same as the one diff --git a/src/global.c b/src/global.c index cea5d228c4a1ce88240213529e60b79475dc1261..53a61dba70374abc0c18a17fadf897925382df59 100644 --- a/src/global.c +++ b/src/global.c @@ -235,6 +235,11 @@ void shortcut_init(int unjustify) const char *cancel_msg = N_("Cancel"); const char *first_line_msg = N_("First Line"); const char *last_line_msg = N_("Last Line"); +#ifndef DISABLE_JUSTIFY + const char *beg_of_par_msg = N_("Beg of Par"); + const char *end_of_par_msg = N_("End of Par"); + const char *fulljstify_msg = N_("FullJstify"); +#endif #ifndef NANO_SMALL const char *case_sens_msg = N_("Case Sens"); const char *direction_msg = N_("Direction"); @@ -289,10 +294,19 @@ void shortcut_init(int unjustify) const char *nano_nextword_msg = N_("Move forward one word"); const char *nano_prevword_msg = N_("Move backward one word"); #endif - const char *nano_verbatim_msg = N_("Insert character(s) verbatim"); +#ifndef DISABLE_JUSTIFY + const char *nano_parabegin_msg = + N_("Go to the beginning of the current paragraph"); + const char *nano_paraend_msg = + N_("Go to the end of the current paragraph"); +#endif #ifdef ENABLE_MULTIBUFFER - const char *nano_openprev_msg = N_("Switch to previous file buffer"); - const char *nano_opennext_msg = N_("Switch to next file buffer"); + const char *nano_openprev_msg = N_("Switch to the previous file buffer"); + const char *nano_opennext_msg = N_("Switch to the next file buffer"); +#endif + const char *nano_verbatim_msg = N_("Insert character(s) verbatim"); +#ifndef DISABLE_JUSTIFY + const char *nano_fulljustify_msg = N_("Justify the entire file"); #endif #ifndef NANO_SMALL #ifdef HAVE_REGEX_H @@ -303,13 +317,6 @@ void shortcut_init(int unjustify) const char *nano_cancel_msg = N_("Cancel the current function"); const char *nano_firstline_msg = N_("Go to the first line of the file"); const char *nano_lastline_msg = N_("Go to the last line of the file"); -#ifndef DISABLE_JUSTIFY - const char *nano_parabegin_msg = - N_("Go to the beginning of the current paragraph"); - const char *nano_paraend_msg = - N_("Go to the end of the current paragraph"); - const char *nano_fulljustify_msg = N_("Justify the entire file"); -#endif #ifndef NANO_SMALL const char *nano_case_msg = N_("Make the current search/replace case (in)sensitive"); @@ -532,9 +539,17 @@ void shortcut_init(int unjustify) NANO_NO_KEY, VIEW, do_prev_word); #endif - sc_init_one(&main_list, NANO_NO_KEY, N_("Verbatim Input"), - IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY, - NANO_NO_KEY, NOVIEW, do_verbatim_input); +#ifndef DISABLE_JUSTIFY + /* Translators: try to keep this string under 10 characters long */ + sc_init_one(&main_list, NANO_NO_KEY, beg_of_par_msg, + IFHELP(nano_parabegin_msg, NANO_PARABEGIN_ALTKEY1), NANO_NO_KEY, + NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin); + + /* Translators: try to keep this string under 10 characters long */ + sc_init_one(&main_list, NANO_NO_KEY, end_of_par_msg, + IFHELP(nano_paraend_msg, NANO_PARAEND_ALTKEY1), NANO_NO_KEY, + NANO_PARAEND_ALTKEY2, VIEW, do_para_end); +#endif #ifdef ENABLE_MULTIBUFFER sc_init_one(&main_list, NANO_NO_KEY, N_("Previous File"), @@ -546,6 +561,17 @@ void shortcut_init(int unjustify) NANO_OPENNEXT_ALTKEY, VIEW, open_nextfile_void); #endif + sc_init_one(&main_list, NANO_NO_KEY, N_("Verbatim Input"), + IFHELP(nano_verbatim_msg, NANO_VERBATIM_KEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_verbatim_input); + +#ifndef DISABLE_JUSTIFY + /* Translators: try to keep this string under 10 characters long */ + sc_init_one(&main_list, NANO_NO_KEY, fulljstify_msg, + IFHELP(nano_fulljustify_msg, NANO_FULLJUSTIFY_ALTKEY), NANO_NO_KEY, + NANO_NO_KEY, NOVIEW, do_full_justify); +#endif + #ifndef NANO_SMALL #ifdef HAVE_REGEX_H sc_init_one(&main_list, NANO_NO_KEY, N_("Find Other Bracket"), @@ -597,18 +623,18 @@ void shortcut_init(int unjustify) #ifndef DISABLE_JUSTIFY /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, N_("Beg of Par"), - IFHELP(nano_parabegin_msg, NANO_NO_KEY), NANO_NO_KEY, - NANO_NO_KEY, VIEW, do_para_begin); + sc_init_one(&whereis_list, NANO_PARABEGIN_KEY, beg_of_par_msg, + IFHELP(nano_parabegin_msg, NANO_PARABEGIN_ALTKEY1), NANO_NO_KEY, + NANO_PARABEGIN_ALTKEY2, VIEW, do_para_begin); /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, NANO_PARAEND_KEY, N_("End of Par"), - IFHELP(nano_paraend_msg, NANO_NO_KEY), NANO_NO_KEY, - NANO_NO_KEY, VIEW, do_para_end); + sc_init_one(&whereis_list, NANO_PARAEND_KEY, end_of_par_msg, + IFHELP(nano_paraend_msg, NANO_PARAEND_ALTKEY1), NANO_NO_KEY, + NANO_PARAEND_ALTKEY2, VIEW, do_para_end); /* Translators: try to keep this string under 10 characters long */ - sc_init_one(&whereis_list, NANO_FULLJUSTIFY_KEY, N_("FullJstify"), - IFHELP(nano_fulljustify_msg, NANO_NO_KEY), NANO_NO_KEY, + sc_init_one(&whereis_list, NANO_FULLJUSTIFY_KEY, fulljstify_msg, + IFHELP(nano_fulljustify_msg, NANO_FULLJUSTIFY_ALTKEY), NANO_NO_KEY, NANO_NO_KEY, NOVIEW, do_full_justify); #endif diff --git a/src/nano.c b/src/nano.c index 2c3c89706b67805e159243b0354e130666dd5b4c..f187961f99e30819bbcd788935ff9d98d35574e1 100644 --- a/src/nano.c +++ b/src/nano.c @@ -412,13 +412,17 @@ void help_init(void) strcpy(help_text, htx); ptr = help_text + strlen(help_text); - /* Now add our shortcut info. */ + /* Now add our shortcut info. Assume that each shortcut has, at the + * very least, an equivalent control key, an equivalent primary meta + * key sequence, or both. Also assume that the meta key values are + * not control characters. We can display a maximum of 3 shortcut + * entries. */ for (s = currshortcut; s != NULL; s = s->next) { - bool meta_shortcut = FALSE; - /* TRUE if the character in s->metaval is shown in the - * first column. */ + int entries = 0; + /* Control key. */ if (s->ctrlval != NANO_NO_KEY) { + entries++; #ifndef NANO_SMALL if (s->ctrlval == NANO_HISTORY_KEY) ptr += sprintf(ptr, "%.7s", _("Up")); @@ -430,30 +434,51 @@ void help_init(void) ptr += sprintf(ptr, "^?"); else ptr += sprintf(ptr, "^%c", s->ctrlval + 64); + *(ptr++) = '\t'; } -#ifndef NANO_SMALL - else if (s->metaval != NANO_NO_KEY) { - meta_shortcut = TRUE; - if (s->metaval == NANO_ALT_SPACE) - ptr += sprintf(ptr, "M-%.5s", _("Space")); - else - ptr += sprintf(ptr, "M-%c", toupper(s->metaval)); - } -#endif - - *(ptr++) = '\t'; - if (s->funcval != NANO_NO_KEY) + /* Function key. */ + if (s->funcval != NANO_NO_KEY) { + entries++; ptr += sprintf(ptr, "(F%d)", s->funcval - KEY_F0); + *(ptr++) = '\t'; + } - *(ptr++) = '\t'; + /* Primary meta key sequence. */ + if (s->metaval != NANO_NO_KEY) { + entries++; + /* If this is the last entry, put it at the end. */ + if (entries == 2 && s->miscval == NANO_NO_KEY) { + entries++; + *(ptr++) = '\t'; + } + /* If the primary meta key sequence is the first entry, + * don't put parentheses around it. */ + if (entries == 1 && s->metaval == NANO_ALT_SPACE) + ptr += sprintf(ptr, "M-%.5s", _("Space")); + else + ptr += sprintf(ptr, entries == 1 ? "M-%c" : "(M-%c)", + toupper(s->metaval)); + *(ptr++) = '\t'; + } - if (!meta_shortcut && s->metaval != NANO_NO_KEY) - ptr += sprintf(ptr, "(M-%c)", toupper(s->metaval)); - else if (meta_shortcut && s->miscval != NANO_NO_KEY) + /* Miscellaneous meta key sequence. */ + if (entries < 3 && s->miscval != NANO_NO_KEY) { + entries++; + /* If this is the last entry, put it at the end. */ + if (entries == 2) { + entries++; + *(ptr++) = '\t'; + } ptr += sprintf(ptr, "(M-%c)", toupper(s->miscval)); + *(ptr++) = '\t'; + } - *(ptr++) = '\t'; + /* Make sure all the help text starts at the same place. */ + while (entries < 3) { + entries++; + *(ptr++) = '\t'; + } assert(s->help != NULL); ptr += sprintf(ptr, "%.*s\n", COLS > 24 ? COLS - 24 : 0, s->help); diff --git a/src/nano.h b/src/nano.h index cf96f2fc0ef852bd5d29db5b876e5da8a43d8e57..1470278cf85ed6928eaaa558d73bc2a7bed2a8e9 100644 --- a/src/nano.h +++ b/src/nano.h @@ -330,6 +330,8 @@ typedef struct historyheadtype { #define NANO_CONTROL_7 31 #define NANO_CONTROL_8 127 +#define NANO_ALT_9 '9' +#define NANO_ALT_0 '0' #define NANO_ALT_A 'a' #define NANO_ALT_B 'b' #define NANO_ALT_C 'c' @@ -358,6 +360,8 @@ typedef struct historyheadtype { #define NANO_ALT_Z 'z' #define NANO_ALT_PERIOD '.' #define NANO_ALT_COMMA ',' +#define NANO_ALT_LPAREN '(' +#define NANO_ALT_RPAREN ')' #define NANO_ALT_LCARAT '<' #define NANO_ALT_RCARAT '>' #define NANO_ALT_RBRACKET ']' @@ -441,8 +445,13 @@ typedef struct historyheadtype { #define NANO_NEXTWORD_KEY NANO_CONTROL_SPACE #define NANO_PREVWORD_KEY NANO_ALT_SPACE #define NANO_PARABEGIN_KEY NANO_CONTROL_W +#define NANO_PARABEGIN_ALTKEY1 NANO_ALT_LPAREN +#define NANO_PARABEGIN_ALTKEY2 NANO_ALT_9 #define NANO_PARAEND_KEY NANO_CONTROL_O +#define NANO_PARAEND_ALTKEY1 NANO_ALT_RPAREN +#define NANO_PARAEND_ALTKEY2 NANO_ALT_0 #define NANO_FULLJUSTIFY_KEY NANO_CONTROL_U +#define NANO_FULLJUSTIFY_ALTKEY NANO_ALT_J #define NANO_VERBATIM_KEY NANO_ALT_V #ifndef NANO_SMALL diff --git a/src/winio.c b/src/winio.c index 8f2f5f9043c4ab14e30d7b3e904289fb24152716..89bee16d97646b3b4ead721a9409a8e31be2360a 100644 --- a/src/winio.c +++ b/src/winio.c @@ -1322,8 +1322,9 @@ bool get_mouseinput(int *mouse_x, int *mouse_y, bool allow_shortcuts) for (; j > 0; j--) s = s->next; - /* And put back the equivalent key. Assume that the shortcut - * has an equivalent control key, meta key sequence, or both. */ + /* And put back the equivalent key. Assume that each shortcut + * has, at the very least, an equivalent control key, an + * equivalent primary meta key sequence, or both. */ if (s->ctrlval != NANO_NO_KEY) unget_kbinput(s->ctrlval, FALSE); else if (s->metaval != NANO_NO_KEY) @@ -3010,14 +3011,19 @@ int statusq(int allowtabs, const shortcut *s, const char *def, break; #ifndef DISABLE_JUSTIFY case NANO_PARABEGIN_KEY: + case NANO_PARABEGIN_ALTKEY1: + case NANO_PARABEGIN_ALTKEY2: do_para_begin(); resetstatuspos = 1; break; case NANO_PARAEND_KEY: + case NANO_PARAEND_ALTKEY1: + case NANO_PARAEND_ALTKEY2: do_para_end(); resetstatuspos = 1; break; case NANO_FULLJUSTIFY_KEY: + case NANO_FULLJUSTIFY_ALTKEY: if (!ISSET(VIEW_MODE)) do_full_justify(); resetstatuspos = 1;