diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/zpty.c | 4 | ||||
-rw-r--r-- | Src/Zle/zle_refresh.c | 51 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 12 | ||||
-rw-r--r-- | Src/init.c | 15 | ||||
-rw-r--r-- | Src/params.c | 3 | ||||
-rw-r--r-- | Src/pattern.c | 14 | ||||
-rw-r--r-- | Src/zsh.h | 6 |
7 files changed, 78 insertions, 27 deletions
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index fca0cc172..d119658c3 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -510,14 +510,14 @@ checkptycmd(Ptycmd cmd) if (cmd->read != -1 || cmd->fin) return; - if ((r = read(cmd->fd, &c, 1)) < 0) { + if ((r = read(cmd->fd, &c, 1)) <= 0) { if (kill(cmd->pid, 0) < 0) { cmd->fin = 1; zclose(cmd->fd); } return; } - if (r) cmd->read = (int) c; + cmd->read = (int) c; } static int diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 17b78ce59..fd5485770 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; /* Offset of rprompt from right of screen */ struct rparams rpms; #ifdef MULTIBYTE_SUPPORT int width; /* width of wide character */ @@ -1573,10 +1574,19 @@ 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) + { + 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 { /* insert >.... on first line if there is more text before start of screen */ ZR_memset(nbuf[0], zr_sp, lpromptw); @@ -1631,9 +1641,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; /* @@ -2113,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/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index e30e0b1aa..25f09c459 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -1504,7 +1504,17 @@ get_comp_string(void) nnb = s + MB_METACHARLEN(s); else nnb = s; - for (tt = s; tt < s + zlemetacs_qsub - wb;) { + tt = s; + if (lincmd) + { + /* + * Ignore '['s at the start of a command as they're not + * matched by closing brackets. + */ + while (*tt == Inbrack && tt < s + zlemetacs_qsub - wb) + tt++; + } + while (tt < s + zlemetacs_qsub - wb) { if (*tt == Inbrack) { i++; nb = nnb; 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), diff --git a/Src/pattern.c b/Src/pattern.c index a7ef12573..b79c3b444 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -1265,12 +1265,18 @@ patcomppiece(int *flagp, int paren) * the character following is an end-of-segment character. Thus * tildes are not special if there is nothing following to * be excluded. + * + * Don't look for X()-style kshglobs at this point; we've + * checked above for the case with parentheses and we don't + * want to match without parentheses. */ - if (kshchar || (memchr(zpc_special, *patparse, ZPC_COUNT) && - (*patparse != zpc_special[ZPC_TILDE] || - patparse[1] == '/' || - !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT)))) + if (kshchar || + (memchr(zpc_special, *patparse, ZPC_NO_KSH_GLOB) && + (*patparse != zpc_special[ZPC_TILDE] || + patparse[1] == '/' || + !memchr(zpc_special, patparse[1], ZPC_SEG_COUNT)))) { break; + } } /* Remember the previous character for backtracking */ @@ -1417,7 +1417,11 @@ enum zpc_chars { ZPC_HAT, /* ^ for exclusion (extended glob) */ ZPC_HASH, /* # for repetition (extended glob) */ ZPC_BNULLKEEP, /* Special backslashed null not removed */ - ZPC_KSH_QUEST, /* ? for ?(...) in KSH_GLOB */ + /* + * These characters are only valid before a parenthesis + */ + ZPC_NO_KSH_GLOB, + ZPC_KSH_QUEST = ZPC_NO_KSH_GLOB, /* ? for ?(...) in KSH_GLOB */ ZPC_KSH_STAR, /* * for *(...) in KSH_GLOB */ ZPC_KSH_PLUS, /* + for +(...) in KSH_GLOB */ ZPC_KSH_BANG, /* ! for !(...) in KSH_GLOB */ |