From 977f9ff5c8137b76fea8e93498086525af460cc5 Mon Sep 17 00:00:00 2001 From: Patrick Oscity Date: Sun, 15 Dec 2013 12:01:21 +0100 Subject: 32114: ZLE_PROMPT_INDENT allows you to move rprompt flush right --- Doc/Zsh/params.yo | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'Doc/Zsh') diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index 9d951bb38..37c79b210 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -1547,4 +1547,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() -- cgit v1.2.3 From 9cacf4411f790f942f92f2c5afb42ffef4339dc7 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Wed, 18 Dec 2013 23:45:20 -0800 Subject: 32157: fix extra line feed after prompt, and erased character in completion listing, when ZLE_RPROMPT_INDENT=0 --- ChangeLog | 7 +++++++ Doc/Zsh/params.yo | 2 +- Src/Zle/zle_refresh.c | 47 ++++++++++++++++++++++++----------------------- Src/init.c | 15 ++++++++++++++- Src/params.c | 3 +++ 5 files changed, 49 insertions(+), 25 deletions(-) (limited to 'Doc/Zsh') diff --git a/ChangeLog b/ChangeLog index 791b5a9c6..3a1417b52 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2013-12-18 Barton E. Schaefer + * 32157: Doc/Zsh/params.yo, Src/Zle/zle_refresh.c, Src/init.c, + Src/params.c: make ZLE_RPROMPT_INDENT a special variable tied to + an internal C global, to avoid having the shell variable value + fetched on every keystroke and to make it available when testing + how to reposition the cursor after the right-prompt is output. + Fixes erasure in completion listing when ZLE_RPROMPT_INDENT=0. + * 32150: Completion/compaudit: Reference loop variable rather than absolute path in executable ownership test diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index 37c79b210..935fd5d86 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -1548,7 +1548,7 @@ ifzman(zmanref(zshcompsys))\ ifnzman(noderef(Completion System)). ) vindex(ZLE_RPROMPT_INDENT) -item(tt(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. diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index debb9730d..fd5485770 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -977,7 +977,7 @@ zrefresh(void) int tmpalloced; /* flag to free tmpline when finished */ int remetafy; /* flag that zle line is metafied */ int txtchange; /* attributes set after prompts */ - int rprompt_off = 1; /* Offset of rprompt from right of screen */ + int rprompt_off; /* Offset of rprompt from right of screen */ struct rparams rpms; #ifdef MULTIBYTE_SUPPORT int width; /* width of wide character */ @@ -1579,16 +1579,12 @@ zrefresh(void) !strchr(rpromptbuf, '\t'); if (put_rpmpt) { - struct value vbuf; - char *name = "ZLE_RPROMPT_INDENT"; - if (getvalue(&vbuf, &name, 1)) { - rprompt_off = (int)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; + rprompt_off = rprompt_indent; + /* 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 { @@ -2127,19 +2123,24 @@ moveto(int ln, int cl) const REFRESH_ELEMENT *rep; if (vcs == winw) { - vln++, vcs = 0; - if (!hasam) { - zputc(&zr_cr); - zputc(&zr_nl); + if (rprompt_indent == 0 && tccan(TCLEFT)) { + tc_leftcurs(1); + vcs--; } 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; + } } } diff --git a/Src/init.c b/Src/init.c index 53c4fbd72..f5aae71f2 100644 --- a/Src/init.c +++ b/Src/init.c @@ -77,7 +77,7 @@ mod_export int tclen[TC_COUNT]; /**/ int tclines, tccolumns; /**/ -mod_export int hasam, hasxn; +mod_export int hasam, hasxn, hasye; /* Value of the Co (max_colors) entry: may not be set */ @@ -699,6 +699,7 @@ init_term(void) /* check whether terminal has automargin (wraparound) capability */ hasam = tgetflag("am"); hasxn = tgetflag("xn"); /* also check for newline wraparound glitch */ + hasye = tgetflag("YE"); /* print in last column does carriage return */ tclines = tgetnum("li"); tccolumns = tgetnum("co"); @@ -748,6 +749,9 @@ init_term(void) tcstr[TCCLEARSCREEN] = ztrdup("\14"); tclen[TCCLEARSCREEN] = 1; } +#if 0 /* This might work, but there may be more to it */ + rprompt_indent = (hasye || !tccan(TCLEFT)) ? 1 : 0; +#endif } return 1; } @@ -999,6 +1003,15 @@ setupvals(void) setiparam("COLUMNS", zterm_columns); setiparam("LINES", zterm_lines); #endif + { + /* Import from environment, overrides init_term() */ + struct value vbuf; + char *name = "ZLE_RPROMPT_INDENT"; + if (getvalue(&vbuf, &name, 1) && !(vbuf.flags & PM_UNSET)) + rprompt_indent = getintvalue(&vbuf); + else + rprompt_indent = 1; + } #ifdef HAVE_GETRLIMIT for (i = 0; i != RLIM_NLIMITS; i++) { diff --git a/Src/params.c b/Src/params.c index d6711e4fa..26ad6b221 100644 --- a/Src/params.c +++ b/Src/params.c @@ -97,6 +97,7 @@ zlong lastval, /* $? */ lastpid, /* $! */ zterm_columns, /* $COLUMNS */ zterm_lines, /* $LINES */ + rprompt_indent, /* $ZLE_RPROMPT_INDENT */ ppid, /* $PPID */ zsh_subshell; /* $ZSH_SUBSHELL */ /**/ @@ -316,8 +317,10 @@ IPDEF4("PPID", &ppid), IPDEF4("ZSH_SUBSHELL", &zsh_subshell), #define IPDEF5(A,B,F) {{NULL,A,PM_INTEGER|PM_SPECIAL},BR((void *)B),GSU(F),10,0,NULL,NULL,NULL,0} +#define IPDEF5U(A,B,F) {{NULL,A,PM_INTEGER|PM_SPECIAL|PM_UNSET},BR((void *)B),GSU(F),10,0,NULL,NULL,NULL,0} IPDEF5("COLUMNS", &zterm_columns, zlevar_gsu), IPDEF5("LINES", &zterm_lines, zlevar_gsu), +IPDEF5U("ZLE_RPROMPT_INDENT", &rprompt_indent, zlevar_gsu), IPDEF5("OPTIND", &zoptind, varinteger_gsu), IPDEF5("SHLVL", &shlvl, varinteger_gsu), IPDEF5("TRY_BLOCK_ERROR", &try_errflag, varinteger_gsu), -- cgit v1.2.3