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

Re: Prompt redrawing issues with wrapped prompt on SIGWINCH



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Thanks for your explanations!

Some remarks: it does not only affect urxvt, but also gnome-terminal. So it's likely to
be a common issue with all terminals?!

Could this be addressed by e.g. having the terminal notify zsh about SIGWINCH before reflowing/rewrapping the text, or something similar?


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

This suggested workaround only helps if you resize the window by one column, e.g.
when using the mouse. But modkey-h/l in awesome changes the master-window-factor
by a percent of the screen size.

I had this workaround before already, without knowing why it worked (under some
conditions).  Now at least that is clearer! :)


Thanks,
Daniel.

On 18.04.2015 17:57, Bart Schaefer wrote:
> On Apr 18,  5:43am, Mikael Magnusson wrote:
> }
> } On Sat, Apr 18, 2015 at 12:56 AM, Daniel Hahler wrote:
> } >
> } > 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 %# '
> 
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iD8DBQFVMo6NfAK/hT/mPgARAljnAJ9jrcw/700cwDRKvzQA/HOqa8Cw6gCeKFcb
P2dRi5KptX6iJdLUZjb+aGY=
=bANY
-----END PGP SIGNATURE-----



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