diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 58aa40e72ab3f3e713d0f17fac0dcb74abfb827a..50ea0c910ee9b7be16017c86b2ea7b626f7e32e4 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.102 2003/12/23 23:13:14 momjian Exp $ +$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.103 2004/01/20 19:49:34 tgl Exp $ PostgreSQL documentation --> @@ -2315,6 +2315,28 @@ testdb=> <userinput>\set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\' </listitem> </varlistentry> + <varlistentry> + <term><literal>%[</literal> ... <literal>%]</literal></term> + <listitem> + <para> + Prompts may contain terminal control characters which, for + example, change the color, background, or style of the prompt + text, or change the title of the terminal window. In order for + the line editing features of readline to work properly, these + non-printing control characters must be designated as invisible + by surrounding them with <literal>%[</literal> and + <literal>%]</literal>. Multiple pairs of these may occur within + the prompt. For example, +<programlisting> +testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%#%] ' +</programlisting> + results in a boldfaced (<literal>1;</literal>) yellow-on-black + (<literal>33;40</literal>) prompt on VT100-compatible, color-capable + terminals. + </para> + </listitem> + </varlistentry> + </variablelist> To insert a percent sign into your prompt, write diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 2b786e201c9efc0f038c947f0955d479014bda34..60e82cc2c3cce589d99e3ec0da136bc93a427fef 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -3,7 +3,7 @@ * * Copyright (c) 2000-2003, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/psql/prompt.c,v 1.31 2003/11/29 19:52:07 pgsql Exp $ + * $PostgreSQL: pgsql/src/bin/psql/prompt.c,v 1.32 2004/01/20 19:49:34 tgl Exp $ */ #include "postgres_fe.h" #include "prompt.h" @@ -12,6 +12,7 @@ #include "settings.h" #include "common.h" +#include "input.h" #include "variables.h" #ifdef WIN32 @@ -57,7 +58,9 @@ * %:name: - The value of the psql variable 'name' * (those will not be rescanned for more escape sequences!) * - * If the application-wide prompts became NULL somehow, the returned string + * %[ ... %] - tell readline that the contained text is invisible + * + * If the application-wide prompts become NULL somehow, the returned string * will be empty (not NULL!). *-------------------------- */ @@ -282,10 +285,23 @@ get_prompt(promptStatus_t status) break; } + case '[': + case ']': +#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE) + /* + * readline >=4.0 undocumented feature: non-printing + * characters in prompt strings must be marked as such, + * in order to properly display the line during editing. + */ + buf[0] = '\001'; + buf[1] = (*p == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE; +#endif /* USE_READLINE */ + break; default: buf[0] = *p; buf[1] = '\0'; + break; } esc = false;