On 14.12.2013, at 17:15 -0800, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> 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;
/*
Attachment:
signature.asc
Description: Message signed with OpenPGP using GPGMail