Hi, I noticed that this patch does not work when PROMPT1 contains a new line, since the whole length of PROMPT1 is taken into account for the length of %w. Attached screenshot shows the issue on my psql, with the following PROMPT variables (colors edited out for readability):
\set PROMPT1 '\n[pid:%p] %n :: %`hostname`:%> ‹%/› \n› ' \set PROMPT2 '%w' Notice in the screenshot that just after inputting a newline, my cursor is far to the right. The length of %w should probably be computed starting from the last newline in PROMPT1. I could technically get rid of my newline, but since my prompt can get pretty long, i like the comfort of having my first line of sql start right at the left of my terminal. Also attached is a trivial patch to fix this issue, which I have not extensively tested (works for me at least), and might not be the right way to do it, but it's a start. Otherwise, nice feature, I like it! Regards, Maxence
commit 7fca5709d3ada8cf0b4219c707562cd841c997d2 (HEAD -> refs/heads/psql_prompt) Author: Maxence Ahlouche <maxence.ahlou...@gmail.com> Date: Wed Nov 27 16:21:35 2019 +0100 Fix %w length in PROMPT2 when PROMPT1 contains a newline, in psql. The width of the invisible PROMPT2 must take into account, in order for user input to be aligned with the first line, that PROMPT1 can contain newlines. diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 41c6f21ecf..a844c384bb 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -366,6 +366,11 @@ get_prompt(promptStatus_t status, ConditionalStack cstack) visible = true; ++p; } + else if (*p == '\n') + { + last_prompt1_width = 0; + ++p; + } else #endif {