diff options
Diffstat (limited to 'Src/Zle')
-rw-r--r-- | Src/Zle/compresult.c | 5 | ||||
-rw-r--r-- | Src/Zle/iwidgets.list | 1 | ||||
-rw-r--r-- | Src/Zle/zle_main.c | 2 | ||||
-rw-r--r-- | Src/Zle/zle_misc.c | 12 | ||||
-rw-r--r-- | Src/Zle/zle_refresh.c | 7 | ||||
-rw-r--r-- | Src/Zle/zle_thingy.c | 10 | ||||
-rw-r--r-- | Src/Zle/zle_tricky.c | 25 |
7 files changed, 53 insertions, 9 deletions
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c index d49c7b811..1d3ee6d27 100644 --- a/Src/Zle/compresult.c +++ b/Src/Zle/compresult.c @@ -1528,6 +1528,7 @@ mod_export int asklist(void) showinglist = listshown = 0; clearflag = (isset(USEZLE) && !termflags && dolastprompt); + lastlistlen = 0; /* Maybe we have to ask if the user wants to see the list. */ if ((!minfo.cur || !minfo.asked) && @@ -1756,16 +1757,20 @@ printlist(int over, CLPrintFunc printm, int showall) pnl = 1; g = g->next; } + lastlistlen = 0; if (clearflag) { /* Move the cursor up to the prompt, if always_last_prompt * * is set and all that... */ if ((ml = listdat.nlines + nlnct - 1) < lines) { tcmultout(TCUP, TCMULTUP, ml); showinglist = -1; + + lastlistlen = listdat.nlines; } else clearflag = 0, putc('\n', shout); } else putc('\n', shout); + listshown = (clearflag ? 1 : -1); return printed; diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list index c28acb438..bd321e8d4 100644 --- a/Src/Zle/iwidgets.list +++ b/Src/Zle/iwidgets.list @@ -44,6 +44,7 @@ "end-of-history", endofhistory, 0 "end-of-line", endofline, 0 "end-of-line-hist", endoflinehist, 0 +"end-of-list", endoflist, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL "exchange-point-and-mark", exchangepointandmark, 0 "execute-last-named-cmd", NULL, 0 "execute-named-cmd", NULL, 0 diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index 622cca6d5..020710f07 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -593,7 +593,7 @@ zleread(char *lp, char *rp, int flags) trashzle(); free(lpromptbuf); free(rpromptbuf); - zleactive = zlereadflags = 0; + zleactive = zlereadflags = lastlistlen = 0; alarm(0); freeundo(); diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index 0e4e58bdb..fef55f01d 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -641,7 +641,7 @@ executenamedcommand(char *prmt) { Thingy cmd; int len, l = strlen(prmt), feep = 0, listed = 0, curlist = 0; - int ols = (listshown && validlist); + int ols = (listshown && validlist), olll = lastlistlen; char *ptr; char *okeymap = curkeymapname; @@ -659,9 +659,10 @@ executenamedcommand(char *prmt) if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { statusline = NULL; selectkeymap(okeymap, 1); - if ((listshown = ols)) + if ((listshown = ols)) { showinglist = -2; - else if (listed) + lastlistlen = olll; + } else if (listed) clearlist = listshown = 1; return NULL; @@ -725,9 +726,10 @@ executenamedcommand(char *prmt) unrefthingy(r); statusline = NULL; selectkeymap(okeymap, 1); - if ((listshown = ols)) + if ((listshown = ols)) { showinglist = -2; - else if (listed) + lastlistlen = olll; + } else if (listed) clearlist = listshown = 1; return r; } diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c index 4c5a0cdf8..75da73efb 100644 --- a/Src/Zle/zle_refresh.c +++ b/Src/Zle/zle_refresh.c @@ -59,6 +59,11 @@ mod_export int showinglist; /**/ mod_export int listshown; +/* Length of last list displayed (if it is below the prompt). */ + +/**/ +mod_export int lastlistlen; + /* Non-zero if ALWAYS_LAST_PROMPT has been used, meaning that the * * screen below the buffer display should not be cleared by * * zrefresh(), but should be by trashzle(). */ @@ -282,7 +287,7 @@ zrefresh(void) clearflag = 0; resetneeded = 1; } - listshown = 0; + listshown = lastlistlen = 0; if (showinglist != -2) showinglist = 0; } diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c index fd9fa3e7f..8cad90e2b 100644 --- a/Src/Zle/zle_thingy.c +++ b/Src/Zle/zle_thingy.c @@ -416,12 +416,18 @@ bin_zle_refresh(char *name, char **args, char *ops, char func) zmult = 1; listlist(l); + if (statusline) + lastlistlen++; showinglist = clearlist = 0; zmult = zmultsav; - } else if (ops['c']) + } else if (ops['c']) { clearlist = 1; - } else if (ops['c']) + lastlistlen = 0; + } + } else if (ops['c']) { clearlist = listshown = 1; + lastlistlen = 0; + } zrefresh(); clearlist = ocl; diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 464e6607e..00bc0382a 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -2009,6 +2009,8 @@ listlist(LinkList l) putc('\n', shout); settyinfo(&shttyinfo); } + lastlistlen = (clearflag ? nlines : 0); + if (ncols) { if (isset(LISTROWSFIRST)) { for (col = 1, p = data, lenp = lens; *p; @@ -2253,3 +2255,26 @@ expandorcompleteprefix(char **args) comppref = 0; return ret; } + +/**/ +int +endoflist(char **args) +{ + if (lastlistlen > 0) { + int i; + + clearflag = 0; + trashzle(); + + for (i = lastlistlen; i > 0; i--) + putc('\n', shout); + + showinglist = lastlistlen = 0; + + if (sfcontext) + zrefresh(); + + return 0; + } + return 1; +} |