zsh-workers
 help / color / mirror / code / Atom feed
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;


  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).