This is a patch to support readline prompts which contain non-printing
authorTom Lane
Tue, 20 Jan 2004 19:49:34 +0000 (19:49 +0000)
committerTom Lane
Tue, 20 Jan 2004 19:49:34 +0000 (19:49 +0000)
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

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/prompt.c

index 58aa40e72ab3f3e713d0f17fac0dcb74abfb827a..50ea0c910ee9b7be16017c86b2ea7b626f7e32e4 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -2315,6 +2315,28 @@ testdb=> \set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\'
    
       
 
+      
+        %[ ... %]
+   
+         
+         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 %[ and
+         %]. Multiple pairs of these may occur within
+         the prompt.  For example,
+
+testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%#%] '
+
+         results in a boldfaced (1;) yellow-on-black
+         (33;40) prompt on VT100-compatible, color-capable
+    terminals.
+       
+        
+      
+
     
 
     To insert a percent sign into your prompt, write
index 2b786e201c9efc0f038c947f0955d479014bda34..60e82cc2c3cce589d99e3ec0da136bc93a427fef 100644 (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;