Re: Uppercase tab completion keywords in psql?

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Peter Eisentraut <peter_e(at)gmx(dot)net>
Cc: David Fetter <david(at)fetter(dot)org>, Andrew Dunstan <andrew(at)dunslane(dot)net>, PostgreSQL-development <pgsql-hackers(at)postgreSQL(dot)org>
Subject: Re: Uppercase tab completion keywords in psql?
Date: 2012-05-03 19:47:48
Message-ID: 20120503194748.GA11248@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Peter, where are we on this?

---------------------------------------------------------------------------

On Fri, Mar 30, 2012 at 08:16:59PM +0300, Peter Eisentraut wrote:
> On fre, 2012-03-23 at 07:52 -0700, David Fetter wrote:
> > On Thu, Mar 22, 2012 at 06:05:30PM -0400, Andrew Dunstan wrote:
> > > On 03/22/2012 05:49 PM, Bruce Momjian wrote:
> > > >Robert Haas and I are disappointed by this change. I liked the
> > > >fact that I could post nice-looking SQL queries without having to
> > > >use my capslock key (which I use as a second control key). Any
> > > >chance of reverting this change?
> > > >
> > >
> > > Should it be governed by a setting?
> >
> > Something like (upper|lower|preserve) ?
>
> How about this patch then? (There are actually four possible settings,
> see patch.)
>

> diff --git i/doc/src/sgml/ref/psql-ref.sgml w/doc/src/sgml/ref/psql-ref.sgml
> index b849101..be9d37d 100644
> --- i/doc/src/sgml/ref/psql-ref.sgml
> +++ w/doc/src/sgml/ref/psql-ref.sgml
> @@ -2652,6 +2652,22 @@ bar
> </varlistentry>
>
> <varlistentry>
> + <term><varname>COMP_KEYWORD_CASE</varname></term>
> + <listitem>
> + <para>
> + Determines which letter case to use when completing an SQL key word.
> + If set to <literal>lower</literal> or <literal>upper</literal>, the
> + completed word will be in lower or upper case, respectively. If set
> + to <literal>preserve-lower</literal>
> + or <literal>preserve-upper</literal> (the default), the completed word
> + will be in the case of the word already entered, but words being
> + completed without anything entered will be in lower or upper case,
> + respectively.
> + </para>
> + </listitem>
> + </varlistentry>
> +
> + <varlistentry>
> <term><varname>DBNAME</varname></term>
> <listitem>
> <para>
> diff --git i/src/bin/psql/tab-complete.c w/src/bin/psql/tab-complete.c
> index 6f481bb..00d87d5 100644
> --- i/src/bin/psql/tab-complete.c
> +++ w/src/bin/psql/tab-complete.c
> @@ -682,7 +682,7 @@ static char **complete_from_variables(char *text,
> const char *prefix, const char *suffix);
> static char *complete_from_files(const char *text, int state);
>
> -static char *pg_strdup_same_case(const char *s, const char *ref);
> +static char *pg_strdup_keyword_case(const char *s, const char *ref);
> static PGresult *exec_query(const char *query);
>
> static void get_previous_words(int point, char **previous_words, int nwords);
> @@ -3048,7 +3048,7 @@ create_or_drop_command_generator(const char *text, int state, bits32 excluded)
> {
> if ((pg_strncasecmp(name, text, string_length) == 0) &&
> !(words_after_create[list_index - 1].flags & excluded))
> - return pg_strdup_same_case(name, text);
> + return pg_strdup_keyword_case(name, text);
> }
> /* if nothing matches, return NULL */
> return NULL;
> @@ -3335,9 +3335,9 @@ complete_from_list(const char *text, int state)
> if (completion_case_sensitive)
> return pg_strdup(item);
> else
> - /* If case insensitive matching was requested initially, return
> - * it in the case of what was already entered. */
> - return pg_strdup_same_case(item, text);
> + /* If case insensitive matching was requested initially, adjust
> + * the case according to setting. */
> + return pg_strdup_keyword_case(item, text);
> }
> }
>
> @@ -3374,9 +3374,9 @@ complete_from_const(const char *text, int state)
> if (completion_case_sensitive)
> return pg_strdup(completion_charp);
> else
> - /* If case insensitive matching was requested initially, return it
> - * in the case of what was already entered. */
> - return pg_strdup_same_case(completion_charp, text);
> + /* If case insensitive matching was requested initially, adjust the
> + * case according to setting. */
> + return pg_strdup_keyword_case(completion_charp, text);
> }
> else
> return NULL;
> @@ -3484,27 +3484,48 @@ complete_from_files(const char *text, int state)
>
>
> /*
> - * Make a pg_strdup copy of s and convert it to the same case as ref.
> + * Make a pg_strdup copy of s and convert the case according to
> + * COMP_KEYWORD_CASE variable, using ref as the text that was already entered.
> */
> static char *
> -pg_strdup_same_case(const char *s, const char *ref)
> +pg_strdup_keyword_case(const char *s, const char *ref)
> {
> char *ret, *p;
> unsigned char first = ref[0];
> + int tocase;
> + const char *varval;
> +
> + varval = GetVariable(pset.vars, "COMP_KEYWORD_CASE");
> + if (!varval)
> + tocase = 0;
> + else if (strcmp(varval, "lower") == 0)
> + tocase = -2;
> + else if (strcmp(varval, "preserve-lower") == 0)
> + tocase = -1;
> + else if (strcmp(varval, "preserve-upper") == 0)
> + tocase = +1;
> + else if (strcmp(varval, "upper") == 0)
> + tocase = +2;
> + else
> + tocase = 0;
>
> - if (isalpha(first))
> - {
> - ret = pg_strdup(s);
> - if (islower(first))
> - for (p = ret; *p; p++)
> - *p = pg_tolower((unsigned char) *p);
> - else
> - for (p = ret; *p; p++)
> - *p = pg_toupper((unsigned char) *p);
> - return ret;
> - }
> + /* default */
> + if (tocase == 0)
> + tocase = +1;
> +
> + ret = pg_strdup(s);
> +
> + if (tocase == -2
> + || ((tocase == -1 || tocase == +1) && islower(first))
> + || (tocase == -1 && !isalpha(first))
> + )
> + for (p = ret; *p; p++)
> + *p = pg_tolower((unsigned char) *p);
> else
> - return pg_strdup(s);
> + for (p = ret; *p; p++)
> + *p = pg_toupper((unsigned char) *p);
> +
> + return ret;
> }
>
>

--
Bruce Momjian <bruce(at)momjian(dot)us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message james 2012-05-03 19:51:30 Re: Have we out-grown Flex?
Previous Message Kevin Grittner 2012-05-03 19:31:22 Re: Re: xReader, double-effort (was: Temporary tables under hot standby)