From: Daniel Shahaf <d.s@daniel.shahaf.name>
To: zsh-workers@zsh.org
Subject: Re: [PATCH] _describe and literal \n
Date: Thu, 29 Sep 2016 14:11:39 +0000 [thread overview]
Message-ID: <20160929141139.GA5059@fujitsu.shahaf.local2> (raw)
In-Reply-To: <92023.1475008338@hydra.kiddle.eu>
Oliver Kiddle wrote on Tue, Sep 27, 2016 at 22:32:18 +0200:
> On 24 Jul, Daniel Shahaf wrote:
> > (let me know if I should push the patch I'd posted)
>
> I don't think anyone ever gave an answer to this. I don't see any
> problem with pushing the patch. While I'm not keen on _describe
> putting \n etc in the descriptions that's not a new thing and with
> the patch it is certainly more consistent.
Thanks for the poke. I looked again and I think I found the underlying
problem.
compadd prints the description using nice*() functions, but _describe
does its width computations using the raw string length; hence compadd
prints a longer string than _describe computed. I think that overflowed
the terminal width due to the "spaces-only" fake match that _describe
adds.
Using 'nice' widths in compdescribe fixes the case from 38928, but not
the one from 38925. I think that one simply needs a s/zputs/nicezputs/
somewhere in the "not part of a group" codepath.
Thanks again for the ping.
Daniel
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 27b78cd..6ac880c 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -199,11 +199,11 @@ cd_calc(void)
set->count++;
if ((l = strlen(str->str)) > cd_state.pre)
cd_state.pre = l;
- if ((l = MB_METASTRWIDTH(str->str)) > cd_state.premaxw)
+ if ((l = ZMB_nicewidth(str->str)) > cd_state.premaxw)
cd_state.premaxw = l;
if (str->desc) {
set->desc++;
- if ((l = strlen(str->desc)) > cd_state.suf)
+ if ((l = strlen(str->desc)) > cd_state.suf) /* ### strlen() assumes no \n */
cd_state.suf = l;
}
}
@@ -490,7 +490,7 @@ cd_init(char *nam, char *hide, char *mlen, char *sep,
setp = &(cd_state.sets);
cd_state.sep = ztrdup(sep);
cd_state.slen = strlen(sep);
- cd_state.swidth = MB_METASTRWIDTH(sep);
+ cd_state.swidth = ZMB_nicewidth(sep);
cd_state.sets = NULL;
cd_state.showd = disp;
cd_state.maxg = cd_state.groups = cd_state.descs = 0;
@@ -526,7 +526,8 @@ cd_init(char *nam, char *hide, char *mlen, char *sep,
str->other = NULL;
str->set = set;
- for (tmp = *ap; *tmp && *tmp != ':'; tmp++)
+ /* Advance tmp to the first unescaped colon. */
+ for (tmp = *ap; *tmp && *tmp != ':'; tmp++)
if (*tmp == '\\' && tmp[1])
tmp++;
@@ -537,7 +538,7 @@ cd_init(char *nam, char *hide, char *mlen, char *sep,
*tmp = '\0';
str->str = str->match = ztrdup(rembslash(*ap));
str->len = strlen(str->str);
- str->width = MB_METASTRWIDTH(str->str);
+ str->width = ZMB_nicewidth(str->str);
str->sortstr = NULL;
}
if (str)
@@ -692,16 +693,16 @@ cd_get(char **params)
* end of screen as safety margin
*/
d = str->desc;
- w = MB_METASTRWIDTH(d);
+ w = ZMB_nicewidth(d);
if (w <= remw)
strcpy(p, d);
else {
pp = p;
while (remw > 0 && *d) {
- l = MB_METACHARLEN(d);
+ l = MB_METACHARLEN(d); /* ### should use a _nice variant? */
memcpy(pp, d, l);
pp[l] = '\0';
- w = MB_METASTRWIDTH(pp);
+ w = ZMB_nicewidth(pp);
if (w > remw) {
*pp = '\0';
break;
@@ -792,17 +793,17 @@ cd_get(char **params)
cd_state.swidth - CM_SPACE;
p = pp = dbuf + cd_state.slen;
d = str->desc;
- w = MB_METASTRWIDTH(d);
+ w = ZMB_nicewidth(d);
if (w <= remw) {
strcpy(p, d);
remw -= w;
pp += strlen(d);
} else
while (remw > 0 && *d) {
- l = MB_METACHARLEN(d);
+ l = MB_METACHARLEN(d); /* ### should use a _nice variant? */
memcpy(pp, d, l);
pp[l] = '\0';
- w = MB_METASTRWIDTH(pp);
+ w = ZMB_nicewidth(pp);
if (w > remw) {
*pp = '\0';
break;
next prev parent reply other threads:[~2016-09-29 14:13 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-23 18:04 Daniel Shahaf
2016-07-23 20:00 ` Bart Schaefer
2016-07-23 21:23 ` Daniel Shahaf
2016-07-23 23:27 ` Oliver Kiddle
2016-07-24 1:27 ` Bart Schaefer
2016-07-24 21:30 ` Daniel Shahaf
2016-09-27 20:32 ` Oliver Kiddle
2016-09-29 14:11 ` Daniel Shahaf [this message]
2016-09-29 14:28 ` Daniel Shahaf
2016-10-07 13:50 ` Daniel Shahaf
2016-10-07 14:53 ` Bart Schaefer
2016-10-08 7:42 ` Daniel Shahaf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160929141139.GA5059@fujitsu.shahaf.local2 \
--to=d.s@daniel.shahaf.name \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).