Greg Sabino Mullane wrote:
>
> http://archives.postgresql.org/pgsql-patches/2005-05/msg00197.php
Applied.
---------------------------------------------------------------------------
Attached is a patch that enhances the "\h" capability in psql. I often
find myself typing a command and then wanting to get the syntax for
it. So I do a ctrl-a and add a \h: but psql does not recognize the
command, because I have stuff attached to it (e.g. "alter table
foobar"),
so I have to scroll over and delete everything except the name of the
command itself. This patch gives \h three chances to match: if nothing
matches the complete string (current behavior), it tries to match the
first two words (e.g. "ALTER TABLE"). If that fails, it tries to match
the first word (e.g. "DELETE").
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/bin/psql/help.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/help.c,v
retrieving revision 1.102
diff -c -c -r1.102 help.c
*** src/bin/psql/help.c 14 Jun 2005 02:57:41 -0000 1.102
--- src/bin/psql/help.c 6 Jul 2005 02:18:59 -0000
***************
*** 305,356 ****
}
else
{
! int i;
bool help_found = false;
FILE *output;
! size_t len;
int nl_count = 0;
char *ch;
! /* don't care about trailing spaces or semicolons */
len = strlen(topic);
while (topic[len - 1] == ' ' || topic[len - 1] == ';')
! len--;
! /* Count newlines for pager */
! for (i = 0; QL_HELP[i].cmd; i++)
{
! if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! strcmp(topic, "*") == 0)
! {
! nl_count += 5;
! for (ch = QL_HELP[i].syntax; *ch != '\0'; ch++)
! if (*ch == '\n')
! nl_count++;
! /* If we have an exact match, exit. Fixes \h SELECT */
! if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! break;
! }
! }
!
! output = PageOutput(nl_count, pager);
!
! for (i = 0; QL_HELP[i].cmd; i++)
! {
! if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! strcmp(topic, "*") == 0)
! {
! help_found = true;
! fprintf(output, _("Command: %s\n"
! "Description: %s\n"
! "Syntax:\n%s\n\n"),
! QL_HELP[i].cmd,
! _(QL_HELP[i].help),
! _(QL_HELP[i].syntax));
! /* If we have an exact match, exit. Fixes \h SELECT */
! if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! break;
! }
}
if (!help_found)
--- 305,382 ----
}
else
{
! int i,j,x=0;
bool help_found = false;
FILE *output;
! size_t len, wordlen;
int nl_count = 0;
char *ch;
! /* User gets two chances: exact match, then the first word */
!
! /* First pass : strip trailing spaces and semicolons */
len = strlen(topic);
while (topic[len - 1] == ' ' || topic[len - 1] == ';')
! len--;
! for (x=1; x<=3; x++) /* Three chances to guess that word... */
{
! if (x>1) /* Nothing on first pass - try the opening words */
! {
! wordlen=j=1;
! while (topic[j] != ' ' && j++<len)
! wordlen++;
! if (x==2)
! {
! j++;
! while (topic[j] != ' ' && j++<=len)
! wordlen++;
! }
! if (wordlen >= len) /* Don't try again if the same word */
! {
! output = PageOutput(nl_count, pager);
! break;
! }
! len = wordlen;
! }
!
! /* Count newlines for pager */
! for (i = 0; QL_HELP[i].cmd; i++)
! {
! if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! strcmp(topic, "*") == 0)
! {
! nl_count += 5;
! for (ch = QL_HELP[i].syntax; *ch != '\0'; ch++)
! if (*ch == '\n')
! nl_count++;
! /* If we have an exact match, exit. Fixes \h SELECT */
! if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! break;
! }
! }
!
! output = PageOutput(nl_count, pager);
!
! for (i = 0; QL_HELP[i].cmd; i++)
! {
! if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
! strcmp(topic, "*") == 0)
! {
! help_found = true;
! fprintf(output, _("Command: %s\n"
! "Description: %s\n"
! "Syntax:\n%s\n\n"),
! QL_HELP[i].cmd,
! _(QL_HELP[i].help),
! _(QL_HELP[i].syntax));
! /* If we have an exact match, exit. Fixes \h SELECT */
! if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
! break;
! }
! }
! if (help_found) /* Don't keep trying if we got a match */
! break;
}
if (!help_found)