Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: return value for `compcall'
- X-seq: zsh-workers 5353
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: PATCH: return value for `compcall'
- Date: Fri, 12 Feb 1999 12:02:25 +0100 (MET)
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
The patch below makes `compcall' return something hopefully useful. It
is zero if no `compctl' was found and non-zero if one was found. More
exactly, it is `1' if a normal compctl was found, `2' if a `pattern compctl'
was found, and `3' if both were found.
The example file `__default' (to which the call to `compcall' was
moved, btw, I forgot to mention this) now uses this return value.
And another thing I forgot: I will write a manual for the new style
completion stuff soon. I don't know if I will finish this today,
though. (Maybe at the weekend, but then again, maybe not).
Bye
Sven
diff -u os/Zle/comp1.c Src/Zle/comp1.c
--- os/Zle/comp1.c Fri Feb 12 11:33:23 1999
+++ Src/Zle/comp1.c Fri Feb 12 11:50:12 1999
@@ -61,7 +61,7 @@
void (*makecomplistcallptr) _((Compctl));
/**/
-void (*makecomplistctlptr) _((int));
+int (*makecomplistctlptr) _((int));
/* Hash table for completion info for commands */
diff -u os/Zle/compctl.c Src/Zle/compctl.c
--- os/Zle/compctl.c Fri Feb 12 11:33:23 1999
+++ Src/Zle/compctl.c Fri Feb 12 11:50:24 1999
@@ -1806,9 +1806,8 @@
zerrnam(name, "can only be called from completion function", NULL, 0);
return 1;
}
- makecomplistctlptr((ops['T'] ? 0 : CFN_FIRST) |
- (ops['D'] ? 0 : CFN_DEFAULT));
- return 0;
+ return makecomplistctlptr((ops['T'] ? 0 : CFN_FIRST) |
+ (ops['D'] ? 0 : CFN_DEFAULT));
}
#define VAR(X) ((void *) (&(X)))
diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c Fri Feb 12 11:33:24 1999
+++ Src/Zle/zle_tricky.c Fri Feb 12 11:54:42 1999
@@ -3640,11 +3640,13 @@
#define MAX_CDEPTH 16
/**/
-void
+int
makecomplistctl(int flags)
{
+ int ret;
+
if (cdepth == MAX_CDEPTH)
- return;
+ return 0;
cdepth++;
SWITCHHEAPS(compheap) {
@@ -3668,9 +3670,10 @@
*q = NULL;
offs = lip + lp;
incompfunc = 2;
- makecomplistglobal(str,
- (!clwpos && !strcmp(compcontext, "command")),
- COMP_COMPLETE, flags);
+ ret = makecomplistglobal(str,
+ (!clwpos &&
+ !strcmp(compcontext, "command")),
+ COMP_COMPLETE, flags);
incompfunc = 1;
offs = ooffs;
compnmatches = mnum;
@@ -3683,13 +3686,15 @@
} LASTALLOC;
} SWITCHBACKHEAPS;
cdepth--;
+
+ return ret;
}
/* This function gets the compctls for the given command line and *
* adds all completions for them. */
/**/
-static void
+static int
makecomplistglobal(char *os, int incmd, int lst, int flags)
{
Compctl cc;
@@ -3721,46 +3726,48 @@
} else if (linredir)
/* In redirections use default completion. */
cc = &cc_default;
- else {
+ else
/* Otherwise get the matches for the command. */
- makecomplistcmd(os, incmd, flags);
- cc = NULL;
- }
+ return makecomplistcmd(os, incmd, flags);
+
if (cc) {
/* First, use the -T compctl. */
if (!(flags & CFN_FIRST)) {
makecomplistcc(&cc_first, os, incmd);
if (!(ccont & CC_CCCONT))
- return;
+ return 0;
}
makecomplistcc(cc, os, incmd);
+ return 1;
}
+ return 0;
}
/* This produces the matches for a command. */
/**/
-static void
+static int
makecomplistcmd(char *os, int incmd, int flags)
{
Compctl cc;
Compctlp ccp;
char *s;
+ int ret = 0;
/* First, use the -T compctl. */
if (!(flags & CFN_FIRST)) {
makecomplistcc(&cc_first, os, incmd);
if (!(ccont & CC_CCCONT))
- return;
+ return 0;
}
/* Then search the pattern compctls, with the command name and the *
* full pathname of the command. */
if (cmdstr) {
- makecomplistpc(os, incmd);
+ ret |= makecomplistpc(os, incmd);
if (!(ccont & CC_CCCONT))
- return;
+ return ret;
}
/* If the command string starts with `=', try the path name of the *
* command. */
@@ -3785,31 +3792,36 @@
(ccp = (Compctlp) compctltab->getnode(compctltab, s)) &&
(cc = ccp->cc))))) {
if (flags & CFN_DEFAULT)
- return;
+ return ret;
cc = &cc_default;
- }
+ } else
+ ret|= 1;
makecomplistcc(cc, os, incmd);
+ return ret;
}
/* This add the matches for the pattern compctls. */
/**/
-static void
+static int
makecomplistpc(char *os, int incmd)
{
Patcomp pc;
Comp pat;
char *s = findcmd(cmdstr, 1);
+ int ret = 0;
for (pc = patcomps; pc; pc = pc->next) {
if ((pat = parsereg(pc->pat)) &&
(domatch(cmdstr, pat, 0) ||
(s && domatch(s, pat, 0)))) {
makecomplistcc(pc->cc, os, incmd);
+ ret |= 2;
if (!(ccont & CC_CCCONT))
- return;
+ return ret;
}
}
+ return ret;
}
/* This produces the matches for one compctl. */
diff -u om/Completion/__default Misc/Completion/__default
--- om/Completion/__default Fri Feb 12 10:55:15 1999
+++ Misc/Completion/__default Fri Feb 12 11:54:24 1999
@@ -2,11 +2,12 @@
# We first try the `compctl's. This is without first (-T) and default (-D)
# completion. If you want them add `-T' and/or `-D' to this command.
-# If this produces any matches, we don't try new style completion. If you
-# want to have that tried anyway, remove the `[[ -nmatches ... ]] ...'
-# below.
+# If there is a `compctl' for the command we are working on, we return
+# immediatly. If you want to use new style completion anyway, remove the
+# `|| return'. Also, you may want to use new style completion if the
+# `compctl' didn't produce any matches. In that case remove the `|| return'
+# and at the line `[[ -nmatches 0 ]] || return' after `compcall'.
-compcall
-[[ -nmatches 0 ]] || return
+compcall || return
__files
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author