From 75fdec17b1ed7e4b3ede4b995003175b885d5f6d Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Thu, 3 Oct 2013 15:59:52 -0700 Subject: 31784: better line width calculation for completion listings When deciding whether there is enough horizontal space to show completion descriptions for each match in a listing, treat the separator as part of the description rather than as part of the match, and account for lines that have already wrapped due to very long matches. --- Src/Zle/computil.c | 58 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 25 deletions(-) (limited to 'Src') diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index ee3918566..f5e6ba195 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -644,35 +644,43 @@ cd_get(char **params) p += str->len; memset(p, ' ', (l = (cd_state.premaxw - str->width + CM_SPACE))); p += l; - strcpy(p, cd_state.sep); - p += cd_state.slen; - /* - * copy a character at once until no more screen width - * is available. Leave 1 character at the end of screen - * as safety margin - */ remw = zterm_columns - cd_state.premaxw - cd_state.swidth - 3; - d = str->desc; - w = MB_METASTRWIDTH(d); - if (w <= remw) - strcpy(p, d); - else { - pp = p; - while (remw > 0 && *d) { - l = MB_METACHARLEN(d); - memcpy(pp, d, l); - pp[l] = '\0'; - w = MB_METASTRWIDTH(pp); - if (w > remw) { - *pp = '\0'; - break; - } + while (remw < 0 && zterm_columns) { + /* line wrapped, use remainder of the extra line */ + remw += zterm_columns; + } + if (cd_state.slen < remw) { + strcpy(p, cd_state.sep); + p += cd_state.slen; + remw -= cd_state.slen; - pp += l; - d += l; - remw -= w; + /* + * copy a character at once until no more screen + * width is available. Leave 1 character at the + * end of screen as safety margin + */ + d = str->desc; + w = MB_METASTRWIDTH(d); + if (w <= remw) + strcpy(p, d); + else { + pp = p; + while (remw > 0 && *d) { + l = MB_METACHARLEN(d); + memcpy(pp, d, l); + pp[l] = '\0'; + w = MB_METASTRWIDTH(pp); + if (w > remw) { + *pp = '\0'; + break; + } + + pp += l; + d += l; + remw -= w; + } } } -- cgit 1.4.1