In case the patch got mangled by the mail server, please see https://github.com/zsh-users/zsh/compare/master...romkatv:rprompt-indent. Roman. On Sun, May 19, 2019 at 5:38 PM Roman Perepelitsa < roman.perepelitsa@gmail.com> wrote: > To reproduce: > > ZLE_RPROMPT_INDENT=0 > PROMPT=12 > RPROMPT=3 > > Expected behavior: The cursor is positioned after ‘2’. > Actual behavior: The cursor is positioned on ‘2’. > > The following patch fixes this issue. > > diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c > index 1f293845f..9c650d3ae 100644--- a/Src/Zle/zle_refresh.c+++ b/Src/Zle/zle_refresh.c > @@ -1678,7 +1678,7 @@ zrefresh(void) > > moveto(0, winw - rprompt_off - rpromptw); > zputs(rpromptbuf, shout);- vcs = winw - rprompt_off;+ vcs = winw - (rprompt_off ? rprompt_off : 1); > /* reset character attributes to that set by the main prompt */ > txtchange = pmpt_attr; > /* > @@ -2159,7 +2159,7 @@ moveto(int ln, int cl) > const REFRESH_ELEMENT *rep; > > if (vcs == winw) {- if (rprompt_indent == 0 && tccan(TCLEFT)) {+ if (0) { > tc_leftcurs(1); > vcs--; > } else { > > There is now an if-else with 0 as the condition. I’ve posted the diff > this way to make it clearer what I’d actually changed. The if-else can, > of course, be replaced with a single block of code (what used to be under > else), which produces a larger diff due to indentation changes. ZSH > source code uses a mixture of tabs and spaces, so I’m not sure if I > deindented it right. > > diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c > index 1f293845f..85f9d9305 100644--- a/Src/Zle/zle_refresh.c+++ b/Src/Zle/zle_refresh.c > @@ -1678,7 +1678,7 @@ zrefresh(void) > > moveto(0, winw - rprompt_off - rpromptw); > zputs(rpromptbuf, shout);- vcs = winw - rprompt_off;+ vcs = winw - (rprompt_off ? rprompt_off : 1); > /* reset character attributes to that set by the main prompt */ > txtchange = pmpt_attr; > /* > @@ -2159,25 +2159,20 @@ moveto(int ln, int cl) > const REFRESH_ELEMENT *rep; > > if (vcs == winw) {- if (rprompt_indent == 0 && tccan(TCLEFT)) {- tc_leftcurs(1);- vcs--;- } else {- vln++, vcs = 0;- if (!hasam) {- zputc(&zr_cr);- zputc(&zr_nl);- } else {- if ((vln < nlnct) && nbuf[vln] && nbuf[vln]->chr)- rep = nbuf[vln];- else- rep = &zr_sp;- zputc(rep);- zputc(&zr_cr);- if ((vln < olnct) && obuf[vln] && obuf[vln]->chr)- *obuf[vln] = *rep;- }- }+ vln++, vcs = 0;+ if (!hasam) {+ zputc(&zr_cr);+ zputc(&zr_nl);+ } else {+ if ((vln < nlnct) && nbuf[vln] && nbuf[vln]->chr)+ rep = nbuf[vln];+ else+ rep = &zr_sp;+ zputc(rep);+ zputc(&zr_cr);+ if ((vln < olnct) && obuf[vln] && obuf[vln]->chr)+ *obuf[vln] = *rep;+ } > } > > if (ln == vln && cl == vcs) > > The same thing on github: > https://github.com/zsh-users/zsh/compare/master…romkatv:rprompt-indent > > . > > I’ve verified that it works correctly with ZLE_RPROMPT_INDENT={0,1,2} in > GNOME Terminal on Ubuntu 18.04. The cursor gets positioned in the right > place and there is no weird behavior in completion menu or other multi-line > ZLE situations. > > Roman. >