Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Re: Don't understand compadd -p (or -P) any more



Peter Stephenson wrote:

> I thought I'd got this worked out, so maybe it's a bug.
> 
> % _foo() { compadd -p pref/ bar rod; }
> % compdef _foo foo
> % foo pref/<TAB>                      # nothing
> % foo <TAB>
> bar rod
> 
> and the choices on the line do have the correct prefix.  In other words, if
> there's a pre-existing prefix there, it doesn't recognise it.  Now it seems
> -P is doing the same thing.  Has the behaviour changed in some way I don't
> understand?

I had played with this the weekend before the last one and wanted to
make the code automatically insert the `-p'-prefix. At that time I had 
a function where it worked, but I don't remember it anymore.
The patch below implements the other thing I tried at the time. With
this, the prefix/suffix given with `-p' and `-s'  have to be present
on the line if matching is done. I think this makes sense (and the
older stuff had some other problems anyway).

The problem with the `-P' prefix was that the prefix on the line
wasn't ignored.

Bye
 Sven

--- os/Zle/zle_tricky.c	Mon Mar  1 16:42:13 1999
+++ Src/Zle/zle_tricky.c	Mon Mar  1 18:08:15 1999
@@ -3984,6 +3984,7 @@
 	   int flags, int aflags, Cmatcher match, char *exp, char **argv)
 {
     char *s, *t, *e, *me, *ms, *lipre = NULL, *lpre, *lsuf, **aign = NULL;
+    char *tlsuf;
     int lpl, lsl, i, pl, sl, test, bpl, bsl, llpl, llsl;
     Aminfo ai;
     Cline lc = NULL;
@@ -4030,6 +4031,14 @@
 		lsuf = dupstring(compsuffix);
 		llpl = strlen(lpre);
 		llsl = strlen(lsuf);
+		/* Test if there is an existing -P prefix. */
+		if (pre && *pre) {
+		    pl = strlen(pre);
+		    if (pl <= llpl && !strncmp(lpre, pre, pl)) {
+			llpl -= pl;
+			lpre += pl;
+		    }
+		}
 		if (isset(GLOBCOMPLETE)) {
 		    char *tmp = (char *) zhalloc(2 + llpl + llsl);
 
@@ -4061,47 +4070,56 @@
 		lsl = strlen(psuf);
 	    } else
 		lsl = 0;
-	    if (pre)
-		pre = dupstring(pre);
-	    if (suf)
-		suf = dupstring(suf);
-	    if (!prpre && (prpre = ppre)) {
-		singsub(&prpre);
-		untokenize(prpre);
-	    } else
-		prpre = dupstring(prpre);
-	    /* Select the group in which to store the matches. */
-	    if (group) {
-		endcmgroup(NULL);
-		begcmgroup(group, (aflags & CAF_NOSORT));
-		if (aflags & CAF_NOSORT)
-		    mgroup->flags |= CGF_NOSORT;
-	    } else {
-		endcmgroup(NULL);
-		begcmgroup("default", 0);
-	    }
-	    /* Select the set of matches. */
-	    if (aflags & CAF_ALT) {
-		l = fmatches;
-		ai = fainfo;
-	    } else {
-		l = matches;
-		ai = ainfo;
-	    }
-	    if (remf) {
-		remf = dupstring(remf);
-		rems = NULL;
-	    } else if (rems)
-		rems = dupstring(rems);
-	    /* Build the common -P prefix. */
-    	    if (ai->pprefix) {
+	    if ((aflags & CAF_MATCH) &&
+		((lpl && (llpl < lpl || strncmp(lpre, ppre, lpl))) ||
+		 (lsl && (llsl < lsl || strncmp(lsuf + llsl - lsl, psuf, lsl)))))
+		*argv = NULL;
+	    else {
+		if (aflags & CAF_MATCH) {
+		    tlsuf = dupstring(lsuf);
+		    tlsuf[llsl - lsl] = '\0';
+		}
 		if (pre)
-		    ai->pprefix[pfxlen(ai->pprefix, pre)] = '\0';
-		else
-		    ai->pprefix[0] = '\0';
-	    } else
-		ai->pprefix = dupstring(pre ? pre : "");
-
+		    pre = dupstring(pre);
+		if (suf)
+		    suf = dupstring(suf);
+		if (!prpre && (prpre = ppre)) {
+		    singsub(&prpre);
+		    untokenize(prpre);
+		} else
+		    prpre = dupstring(prpre);
+		/* Select the group in which to store the matches. */
+		if (group) {
+		    endcmgroup(NULL);
+		    begcmgroup(group, (aflags & CAF_NOSORT));
+		    if (aflags & CAF_NOSORT)
+			mgroup->flags |= CGF_NOSORT;
+		} else {
+		    endcmgroup(NULL);
+		    begcmgroup("default", 0);
+		}
+		/* Select the set of matches. */
+		if (aflags & CAF_ALT) {
+		    l = fmatches;
+		    ai = fainfo;
+		} else {
+		    l = matches;
+		    ai = ainfo;
+		}
+		if (remf) {
+		    remf = dupstring(remf);
+		    rems = NULL;
+		} else if (rems)
+		    rems = dupstring(rems);
+		/* Build the common -P prefix. */
+		if (ai->pprefix) {
+		    if (pre)
+			ai->pprefix[pfxlen(ai->pprefix, pre)] = '\0';
+		    else
+			ai->pprefix[0] = '\0';
+		} else
+		    ai->pprefix = dupstring(pre ? pre : "");
+	    }
 	    /* Walk through the matches given. */
 	    for (; (s = dupstring(*argv)); argv++) {
 		sl = strlen(s);
@@ -4136,19 +4154,19 @@
 			else
 			    continue;
 		    } else {
-			test = (sl >= llpl + llsl &&
-				strpfx(lpre, s) && strsfx(lsuf, s));
+			test = (sl >= llpl + llsl - lpl - lsl &&
+				strpfx(lpre + lpl, s) && strsfx(tlsuf, s));
 			if (!test && mstack &&
-			    (ms = comp_match(lpre, lsuf, s,
+			    (ms = comp_match(lpre + lpl, tlsuf, s,
 					     &lc, (aflags & CAF_QUOTE),
 					     &bpl, &bsl)))
 			    test = 1;
 
 			if (!test)
 			    continue;
-			pl = sl - llsl;
-			me = s + sl - llsl;
-			e = s + llpl;
+			pl = sl - (llsl - lsl);
+			me = s + sl - (llsl - lsl);
+			e = s + (llpl - lpl);
 		    }
 		} else {
 		    e = s;
@@ -4175,7 +4193,7 @@
 		if (ppre)
 		    t = dyncat(ppre, t);
 		if (!cp && !ms && mstack) {
-		    int bl = ((aflags & CAF_MATCH) ? llpl : 0);
+		    int bl = ((aflags & CAF_MATCH) ? (llpl - lpl) : 0);
 		    Cline *clp = &lc, tlc;
 		    char *ss = dupstring(s), *ee = me + (ss - s);
 

--
Sven Wischnowsky                         wischnow@xxxxxxxxxxxxxxxxxxxxxxx



Messages sorted by: Reverse Date, Date, Thread, Author