Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Prompt redrawing issues with wrapped prompt on SIGWINCH



On Apr 18,  5:43am, Mikael Magnusson wrote:
}
} On Sat, Apr 18, 2015 at 12:56 AM, Daniel Hahler
} <genml+zsh-workers@xxxxxxxxxx> wrote:
} > -----BEGIN PGP SIGNED MESSAGE-----
} > Hash: SHA1
} >
} > I am seeing weird redrawing issues when resizing the terminal window with the prompt at the bottom, and the prompt needs to be rewrapped.
} >
} 
} Urxvt reflows long lines on resize and obviously this happens before
} zsh gets a chance to redraw the prompt. I don't know if there's any
} possible way zle can know how the cursor moved because of this, and
} especially difficult is to know how much the display scrolled.

In fact you can see what's happening if you change your test case like
so:

PS1='${(pl:COLUMNS::=:)} %# %{$(sleep 5)%}'

(I removed some unnecessary expansions and changed quoting to get rid of
backslashes.)  The above makes zsh pause for 5 seconds in the middle of
drawing the prompt.  This will allow you to see what urxvt has done with
the display and the cursor position before zsh gets a chance to begin to
redraw the prompt.

On my system the cursor ends up near the left end of the first line of
"======" (directly above where it was previously, the "======" having
wrapped to two lines) when urxvt is done narrowing the window.  The
prompt redraw expects it to be at the end of the second line near the
"%" sign, so it moves up one line before beginning to redraw.

Conversely when widening the window, ZLE expects the (previously full)
line of "=====" to have scrolled the terminal down one line because an
"=" was printed in the lower right corner, so it again moves up before
displaying the prompt.  (Unlike the misplaced cursor, this may be a
situation that could be fixed by comparing the previous and new values
of $COLUMNS before deciding how many lines the prompt occupies.)

You can avoid both of those problems by defining the prompt this way:

PS1='${(pl:COLUMNS-1::=:)}
 %# '

That is, leave one blank column at the right and insert an explicit
newline instead of relying on urxvt to wrap at the margin. The newline
forces urxvt to put the cursor on the correct line when narrowing, and
the shortened line of "======" allows zsh to ignore auto-margin-wrap
and therefore correctly compute the number of lines the prompt uses
when widening.

This can be written on one line with $'...' syntax:

PS1=$'${(pl:COLUMNS-1::=:)}\n %# '



Messages sorted by: Reverse Date, Date, Thread, Author