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