diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index c5b091c..aa71674 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -560,19 +560,18 @@ EOF
 
     <varlistentry>
       <term><option>-?</></term>
-      <term><option>--help</></term>
-      <term><option>--help=<replaceable class="parameter">topic</replaceable></option></term>
+      <term><option>--help[=<replaceable class="parameter">topic</>]</option></term>
       <listitem>
       <para>
-      Show help about <application>psql</application> command line
-      arguments, and exit.
+      Show help about <application>psql</application> and exit. The optional
+      <replaceable class="parameter">topic</> parameter (defaulting
+      to <literal>options</literal>) selects which part of psql is
+      explained: <literal>commands</> describes <application>psql</>'s
+      backslash commands; <literal>options</> describes the commandline
+      switches that can be passed to <application>psql</>;
+      and <literal>variables</> shows help about about psql configuration
+      variables.
       </para>
-
-      <para>
-      <option>--help=variables</>show help about <application>psql</application> variables,
-      and exit.
-      </para>
-
       </listitem>
     </varlistentry>
 
@@ -2581,12 +2580,17 @@ testdb=&gt; <userinput>\setenv LESS -imx4F</userinput>
 
 
       <varlistentry>
-        <term><literal>\? [ options | variables ]</literal></term>
+        <term><literal>\? [ <replaceable class="parameter">topic</> ]</literal></term>
         <listitem>
         <para>
-        Shows help information about the backslash commands.  This command can have a
-        option "variables" or "options" to take help for psql configuration variables
-        or psql command line options.
+        Shows help information. The optional
+        <replaceable class="parameter">topic</> parameter
+        (defaulting to <literal>commands</>) selects which part of psql is
+        explained: <literal>commands</> describes <application>psql</>'s
+        backslash commands; <literal>options</> describes the commandline
+        switches that can be passed to <application>psql</>;
+        and <literal>variables</> shows help about about psql configuration
+        variables.
         </para>
         </listitem>
       </varlistentry>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index c7140b8..5d90ca2 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -1495,12 +1495,12 @@ exec_command(const char *cmd,
 		char	   *opt0 = psql_scan_slash_option(scan_state,
 													OT_NORMAL, NULL, false);
 
-		if (!opt0)
+		if (!opt0 || strcmp(opt0, "commands") == 0)
 			slashUsage(pset.popt.topt.pager);
-		else if (strcmp(opt0, "variables") == 0)
-			help_variables(pset.popt.topt.pager);
 		else if (strcmp(opt0, "options") == 0)
 			usage(pset.popt.topt.pager);
+		else if (strcmp(opt0, "variables") == 0)
+			helpVariables(pset.popt.topt.pager);
 		else
 			slashUsage(pset.popt.topt.pager);
 	}
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 0ada015..ef35696 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -86,8 +86,9 @@ usage(unsigned short int pager)
 	fprintf(output, _("  -X, --no-psqlrc          do not read startup file (~/.psqlrc)\n"));
 	fprintf(output, _("  -1 (\"one\"), --single-transaction\n"
 			 "                           execute as a single transaction (if non-interactive)\n"));
-	fprintf(output, _("  -?, --help               show this help, then exit\n"));
-	fprintf(output, _("  --help=variables         show a list of all specially treated variables, then exit\n"));
+	fprintf(output, _("  -?, --help[=options]     show this help, then exit\n"));
+	fprintf(output, _("      --help=variables     show a list of all specially treated variables, then exit\n"));
+	fprintf(output, _("      --help=commands      show a list of backslash commands, then exit\n"));
 
 	fprintf(output, _("\nInput and output options:\n"));
 	fprintf(output, _("  -a, --echo-all           echo all input from script\n"));
@@ -171,8 +172,8 @@ slashUsage(unsigned short int pager)
 
 	fprintf(output, _("Help\n"));
 
-	fprintf(output, _("  \\?                     description of all psql commands\n"));
-	fprintf(output, _("  \\? options             description of psql options\n"));
+	fprintf(output, _("  \\? [commands]          description of all psql backslash commands\n"));
+	fprintf(output, _("  \\? options             description of all psql commandline options\n"));
 	fprintf(output, _("  \\? variables           description of all psql configuration variables\n"));
 	fprintf(output, _("  \\h [NAME]              help on syntax of SQL commands, * for all commands\n"));
 	fprintf(output, "\n");
@@ -294,14 +295,16 @@ slashUsage(unsigned short int pager)
 
 
 /*
+ * helpVariables
+ *
  * show list of available variables (options) from command line
  */
 void
-help_variables(unsigned short int pager)
+helpVariables(unsigned short int pager)
 {
 	FILE	   *output;
 
-	output = PageOutput(86, pager);
+	output = PageOutput(81, pager);
 
 	fprintf(output, _("List of specially treated variables.\n"));
 
@@ -329,16 +332,16 @@ help_variables(unsigned short int pager)
 	fprintf(output, _("  ON_ERROR_ROLLBACK  if set, an error doesn't stop a transaction (uses implicit SAVEPOINTs)\n"));
 	fprintf(output, _("  ON_ERROR_STOP      stop batch execution after error\n"));
 	fprintf(output, _("  PORT               server port of the current connection\n"));
-	fprintf(output, _("  PROMPT1            specify standard the psql prompt\n"));
-	fprintf(output, _("  PROMPT2            specify the psql prompt when statement continues from previous line\n"));
-	fprintf(output, _("  PROMPT3            specify the psql prompt used by COPY statement\n"));
+	fprintf(output, _("  PROMPT1            specify the standard psql prompt\n"));
+	fprintf(output, _("  PROMPT2            specify the prompt used when a statement continues from a previous line\n"));
+	fprintf(output, _("  PROMPT3            specify the prompt used during COPY ... FROM STDIN\n"));
 	fprintf(output, _("  QUIET              run quietly (same as -q option)\n"));
 	fprintf(output, _("  SINGLELINE         end of line terminates SQL command mode (same as -S option)\n"));
 	fprintf(output, _("  SINGLESTEP         single-step mode (same as -s option)\n"));
 	fprintf(output, _("  USER               the currently connected database user\n"));
 	fprintf(output, _("  VERBOSITY          control verbosity of error reports [default, verbose, terse]\n"));
 
-	fprintf(output, _("\nPrinting options:\n"));
+	fprintf(output, _("\nDisplay influencing variables:\n"));
 	fprintf(output, _("Usage:\n"));
 	fprintf(output, _("  psql --pset=NAME[=VALUE]\n  or \\pset NAME [VALUE] in interactive mode\n\n"));
 
@@ -388,10 +391,6 @@ help_variables(unsigned short int pager)
 	fprintf(output, _("  SHELL              shell used by the \\! command\n"));
 	fprintf(output, _("  TMPDIR             directory for temporary files\n"));
 
-	fprintf(output, _("\nFor more information consult the psql section in the PostgreSQL\n"
-			 "documentation.\n\n"));
-	fprintf(output, _("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
-
 	ClosePager(output);
 }
 
diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h
index bab360d..3ad374a 100644
--- a/src/bin/psql/help.h
+++ b/src/bin/psql/help.h
@@ -12,7 +12,7 @@ void		usage(unsigned short int pager);
 
 void		slashUsage(unsigned short int pager);
 
-void		help_variables(unsigned short int pager);
+void		helpVariables(unsigned short int pager);
 
 void		helpSQL(const char *topic, unsigned short int pager);
 
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index dd051e6..b879d0c 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -394,7 +394,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 
 	memset(options, 0, sizeof *options);
 
-	while ((c = getopt_long(argc, argv, "aAbc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxXz?0",
+	while ((c = getopt_long(argc, argv, "aAbc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxXz?01",
 							long_options, &optindex)) != -1)
 	{
 		switch (c)
@@ -558,29 +558,32 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 				options->single_txn = true;
 				break;
 			case '?':
+				/* Actual help option given */
 				if (strcmp(argv[optind - 1], "-?") == 0)
 				{
 					usage(NOPAGER);
 					exit(EXIT_SUCCESS);
 				}
+				/* unknown option reported by getopt */
 				else
-				{
-					fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
-							pset.progname);
-					exit(EXIT_FAILURE);
-				}
+					goto unknown_option;
 				break;
 			case 1:
 				{
-					if (optarg && strcmp(optarg, "variables") == 0)
-						help_variables(NOPAGER);
-					else
+					if (!optarg || strcmp(optarg, "options") == 0)
 						usage(NOPAGER);
+					else if (optarg && strcmp(optarg, "commands") == 0)
+						slashUsage(NOPAGER);
+					else if (optarg && strcmp(optarg, "variables") == 0)
+						helpVariables(NOPAGER);
+					else
+						goto unknown_option;
 
 					exit(EXIT_SUCCESS);
 				}
 				break;
 			default:
+			unknown_option:
 				fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
 						pset.progname);
 				exit(EXIT_FAILURE);
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 012f8c5..4ce47e9 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3546,7 +3546,7 @@ psql_completion(const char *text, int start, int end)
 	else if (strcmp(prev_wd, "\\?") == 0)
 	{
 		static const char *const my_list[] =
-		{"options", "variables", NULL};
+		{"commands", "options", "variables", NULL};
 
 		COMPLETE_WITH_LIST_CS(my_list);
 	}
