On 14.12.2013, at 17:15 -0800, Bart Schaefer wrote: > It appears that if you want to make this offset different from 1, you > are going to have to change countprompt() to include the offset in the > width of the prompt rather than just fiddle with math in the output code. Maybe I was too enthusiastic ;-) I continued experimenting with my original patch and hard coded an offset of 5 instead of removing it, just to see what happens: diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 17b78ce..f136178 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -1576,7 +1576,7 @@ zrefresh(void) else put_rpmpt = rprompth == 1 && rpromptbuf[0] && !strchr(rpromptbuf, '\t') && - (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1; + (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 5; } else { /* insert >.... on first line if there is more text before start of screen */ ZR_memset(nbuf[0], zr_sp, lpromptw); @@ -1631,9 +1631,9 @@ zrefresh(void) if (put_rpmpt && !iln && !oput_rpmpt) { int attrchange; - moveto(0, winw - 1 - rpromptw); + moveto(0, winw - 5 - rpromptw); zputs(rpromptbuf, shout); - vcs = winw - 1; + vcs = winw - 5; /* reset character attributes to that set by the main prompt */ txtchange = pmpt_attr; /* This did not result in the problem you described. It worked just as expected, not misplacing the cursor at all, so I figured that the problem had to be introduced by Peter's patch. I came up with the following fix, which also sets the vcs variable according to rprompt_off, instead of subtracting the fixed value 1 (last change in the diff). This fixed the issue for me with arbitrary values for ZLE_RPROMPT_INDENT. diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index b7b7750..2039fa1 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -1531,4 +1531,17 @@ See the completion system documentation in ifzman(zmanref(zshcompsys))\ ifnzman(noderef(Completion System)). ) +vindex(ZLE_RPROMPT_INDENT) +item(tt(ZLE_RPROMPT_INDENT))( +If set, used to give the indentation between the right hand side of +the right prompt in the line editor as given by tt(RPS1) or tt(RPROMPT) +and the right hand side of the screen. If not set, the value 1 is used. + +Typically this will be used to set the value to 0 so that the prompt +appears flush with the right hand side of the screen. This is not the +default as many terminals do not handle this correctly, in particular +when the prompt appears at the extreme bottom right of the screen. +Recent virtual terminals are more likely to handle this case correctly. +Some experimentation is necessary. +) enditem() diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 17b78ce..83cbd0b 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -976,7 +976,8 @@ zrefresh(void) int tmppos; /* t - tmpline */ int tmpalloced; /* flag to free tmpline when finished */ int remetafy; /* flag that zle line is metafied */ - int txtchange; /* attributes set after prompts */ + int txtchange; /* attributes set after prompts */ + int rprompt_off = 1; /* Offset of rprompt from right of screen */ struct rparams rpms; #ifdef MULTIBYTE_SUPPORT int width; /* width of wide character */ @@ -1573,10 +1574,23 @@ zrefresh(void) if (!more_start) { if (trashedzle && opts[TRANSIENTRPROMPT]) put_rpmpt = 0; - else + else { put_rpmpt = rprompth == 1 && rpromptbuf[0] && - !strchr(rpromptbuf, '\t') && - (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1; + !strchr(rpromptbuf, '\t'); + if (put_rpmpt) + { + struct value vbuf; + char *name = "ZLE_RPROMPT_INDENT"; + if (getvalue(&vbuf, &name, 1)) { + rprompt_off = getintvalue(&vbuf); + /* sanity to avoid horrible things happening */ + if (rprompt_off < 0) + rprompt_off = 0; + } + put_rpmpt = + (int)ZR_strlen(nbuf[0]) + rpromptw < winw - rprompt_off; + } + } } else { /* insert >.... on first line if there is more text before start of screen */ ZR_memset(nbuf[0], zr_sp, lpromptw); @@ -1631,9 +1645,9 @@ zrefresh(void) if (put_rpmpt && !iln && !oput_rpmpt) { int attrchange; - moveto(0, winw - 1 - rpromptw); + moveto(0, winw - rprompt_off - rpromptw); zputs(rpromptbuf, shout); - vcs = winw - 1; + vcs = winw - rprompt_off; /* reset character attributes to that set by the main prompt */ txtchange = pmpt_attr; /*