This is a patch to support readline prompts which contain non-printing

characters, as for fancy colorized prompts.  This was nearly a direct
lift from bash-2.05b's lib/readline/display.c, per guidance from Chet Ramey.

Reece Hart
This commit is contained in:
Tom Lane 2004-01-20 19:49:34 +00:00
parent bd046b99f0
commit 18f7a8e262
2 changed files with 41 additions and 3 deletions

View File

@ -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

View File

@ -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;