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;