zsh-workers
 help / color / mirror / code / Atom feed
From: Sven Wischnowsky <wischnow@informatik.hu-berlin.de>
To: zsh-workers@sunsite.auc.dk
Subject: PATCH: Re: Don't understand compadd -p (or -P) any more
Date: Mon, 1 Mar 1999 18:10:07 +0100 (MET)	[thread overview]
Message-ID: <199903011710.SAA16183@beta.informatik.hu-berlin.de> (raw)
In-Reply-To: Peter Stephenson's message of Mon, 01 Mar 1999 17:13:23 +0100


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@informatik.hu-berlin.de


             reply	other threads:[~1999-03-01 17:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-03-01 17:10 Sven Wischnowsky [this message]
1999-03-01 17:18 ` Something wrong with dependencies (RE: PATCH: Re: Don't understand compadd -p (or -P) any more) Andrej Borsenkow
1999-03-02  9:14 PATCH: Re: Don't understand compadd -p (or -P) any more Sven Wischnowsky

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=199903011710.SAA16183@beta.informatik.hu-berlin.de \
    --to=wischnow@informatik.hu-berlin.de \
    --cc=zsh-workers@sunsite.auc.dk \
    /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).