summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/zle_refresh.c47
-rw-r--r--Src/init.c15
-rw-r--r--Src/params.c3
3 files changed, 41 insertions, 24 deletions
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),