Re: Uppercase tab completion keywords in psql? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Uppercase tab completion keywords in psql?
Date
Msg-id 20120503194748.GA11248@momjian.us
Whole thread Raw
In response to Re: Uppercase tab completion keywords in psql?  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: Uppercase tab completion keywords in psql?
List 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@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +


pgsql-hackers by date:

Previous
From: "Kevin Grittner"
Date:
Subject: Re: Re: xReader, double-effort (was: Temporary tables under hot standby)
Next
From: james
Date:
Subject: Re: Have we out-grown Flex?