* Re: PATCH: Re: Don't understand compadd -p (or -P) any more
@ 1999-03-02 9:14 Sven Wischnowsky
0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 1999-03-02 9:14 UTC (permalink / raw)
To: zsh-workers
I wrote:
> I had played with this the weekend before the last one and wanted to
> make the code automatically insert the `-p'-prefix.
Thinking about this some more, I found a really easy way to get this
(should have thought of this from the beginning...).
The patch below makes `compadd' eagerly insert as much of the `-p' and
`-P' prefixes as possible. The problem with the older solution was
that it required the `-p' prefix to be on the line. When comparing it
with the old code this seemed to make sense, since the `-p' prefix is
like an path prefix when completing files in the old code, where this
prefix is *taken* from the line. With `compadd' it's the other way
round: one *gives* such a prefix and suddenly this is completely
independent of the contents of the line. With that I had some trouble
finding out, what should be used for matching. Should the line match
`<-p><match><-s>', or only `<match>'? The patch below makes the `-P'
prefix be ignored as for `comp{gen,ctl}', then it sees if what's on
the line matches the beginning of the `-p' prefix. If there is nothing
on the line, it just uses an empty string for matching, otherwise the
`-p'-prefix-part from the line is *not* used for matching, only what's
after it.
And the same for the suffix, of course.
Bye
Sven
diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c Mon Mar 1 18:10:54 1999
+++ Src/Zle/zle_tricky.c Tue Mar 2 08:49:24 1999
@@ -3984,7 +3984,6 @@
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;
@@ -4033,11 +4032,9 @@
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;
- }
+ pl = pfxlen(pre, lpre);
+ llpl -= pl;
+ lpre += pl;
}
if (isset(GLOBCOMPLETE)) {
char *tmp = (char *) zhalloc(2 + llpl + llsl);
@@ -4070,15 +4067,27 @@
lsl = strlen(psuf);
} else
lsl = 0;
- 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 (aflags & CAF_MATCH) {
+ s = ppre ? ppre : "";
+ if (llpl <= lpl && strpfx(lpre, s)) {
+ llpl = 0;
+ lpre = "";
+ } else if (llpl > lpl && strpfx(s, lpre)) {
+ llpl -= lpl;
+ lpre += lpl;
+ } else
+ *argv = NULL;
+ s = psuf ? psuf : "";
+ if (llsl <= lsl && strsfx(lsuf, s)) {
+ llsl = 0;
+ lsuf = "";
+ } else if (llsl > lsl && strsfx(s, lsuf)) {
+ lsuf[llsl - lsl] = '\0';
+ llsl -= lsl;
+ } else
+ *argv = NULL;
+ }
+ if (*argv) {
if (pre)
pre = dupstring(pre);
if (suf)
@@ -4154,19 +4163,19 @@
else
continue;
} else {
- test = (sl >= llpl + llsl - lpl - lsl &&
- strpfx(lpre + lpl, s) && strsfx(tlsuf, s));
+ test = (sl >= llpl + llsl &&
+ strpfx(lpre, s) && strsfx(lsuf, s));
if (!test && mstack &&
- (ms = comp_match(lpre + lpl, tlsuf, s,
+ (ms = comp_match(lpre, lsuf, s,
&lc, (aflags & CAF_QUOTE),
&bpl, &bsl)))
test = 1;
if (!test)
continue;
- pl = sl - (llsl - lsl);
- me = s + sl - (llsl - lsl);
- e = s + (llpl - lpl);
+ pl = sl - llsl;
+ me = s + sl - llsl;
+ e = s + llpl;
}
} else {
e = s;
@@ -4193,7 +4202,7 @@
if (ppre)
t = dyncat(ppre, t);
if (!cp && !ms && mstack) {
- int bl = ((aflags & CAF_MATCH) ? (llpl - lpl) : 0);
+ int bl = ((aflags & CAF_MATCH) ? llpl : 0);
Cline *clp = &lc, tlc;
char *ss = dupstring(s), *ee = me + (ss - s);
--
Sven Wischnowsky wischnow@informatik.hu-berlin.de
^ permalink raw reply [flat|nested] 2+ messages in thread
* PATCH: Re: Don't understand compadd -p (or -P) any more
@ 1999-03-01 17:10 Sven Wischnowsky
0 siblings, 0 replies; 2+ messages in thread
From: Sven Wischnowsky @ 1999-03-01 17:10 UTC (permalink / raw)
To: zsh-workers
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~1999-03-02 9:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-03-02 9:14 PATCH: Re: Don't understand compadd -p (or -P) any more Sven Wischnowsky
-- strict thread matches above, loose matches on Subject: below --
1999-03-01 17:10 Sven Wischnowsky
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).