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 --- Src/Zle/zle_refresh.c | 47 ++++++++++++++++++++++++----------------------- Src/init.c | 15 ++++++++++++++- Src/params.c | 3 +++ 3 files changed, 41 insertions(+), 24 deletions(-) (limited to 'Src') 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 1.4.1