From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18484 invoked from network); 5 Mar 1999 13:46:58 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 5 Mar 1999 13:46:58 -0000 Received: (qmail 24101 invoked by alias); 5 Mar 1999 13:46:26 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 5663 Received: (qmail 24092 invoked from network); 5 Mar 1999 13:46:23 -0000 Date: Fri, 5 Mar 1999 14:45:39 +0100 (MET) Message-Id: <199903051345.OAA04584@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk Subject: PATCH: widgets from compctl For calling completion widgets from `compctl' no trickery with `-K' will ever bring us on the save side, so the patch below adds the option `-i function' (think of it as `invoke the widget...' if you like). Bye Sven diff -u os/Zle/comp.h Src/Zle/comp.h --- os/Zle/comp.h Fri Mar 5 14:23:31 1999 +++ Src/Zle/comp.h Fri Mar 5 14:33:55 1999 @@ -103,6 +103,7 @@ char *glob; /* for -g (globbing) */ char *str; /* for -s (expansion) */ char *func; /* for -K (function) */ + char *widget; /* for -i (function) */ char *explain; /* for -X (explanation) */ char *ylist; /* for -y (user-defined desc. for listing) */ char *prefix, *suffix; /* for -P and -S (prefix, suffix) */ diff -u os/Zle/comp1.c Src/Zle/comp1.c --- os/Zle/comp1.c Fri Mar 5 14:23:31 1999 +++ Src/Zle/comp1.c Fri Mar 5 14:36:27 1999 @@ -172,6 +172,7 @@ zsfree(cc->glob); zsfree(cc->str); zsfree(cc->func); + zsfree(cc->widget); zsfree(cc->explain); zsfree(cc->ylist); zsfree(cc->prefix); diff -u os/Zle/compctl.c Src/Zle/compctl.c --- os/Zle/compctl.c Fri Mar 5 14:23:31 1999 +++ Src/Zle/compctl.c Fri Mar 5 14:35:48 1999 @@ -578,6 +578,19 @@ *argv = "" - 1; } break; + case 'i': + if ((*argv)[1]) { + cct.widget = (*argv) + 1; + *argv = "" - 1; + } else if (!argv[1]) { + zwarnnam(name, "function name expected after -%c", NULL, + **argv); + return 1; + } else { + cct.widget = *++argv; + *argv = "" - 1; + } + break; case 'Y': cct.mask |= CC_EXPANDEXPL; goto expl; @@ -1197,6 +1210,7 @@ zsfree(cc->glob); zsfree(cc->str); zsfree(cc->func); + zsfree(cc->widget); zsfree(cc->explain); zsfree(cc->ylist); zsfree(cc->prefix); @@ -1217,6 +1231,7 @@ cc->glob = ztrdup(cct->glob); cc->str = ztrdup(cct->str); cc->func = ztrdup(cct->func); + cc->widget = ztrdup(cct->widget); cc->explain = ztrdup(cct->explain); cc->ylist = ztrdup(cct->ylist); cc->prefix = ztrdup(cct->prefix); @@ -1423,6 +1438,7 @@ printif(cc->gname, 'J'); printif(cc->keyvar, 'k'); printif(cc->func, 'K'); + printif(cc->widget, 'i'); printif(cc->explain, (cc->mask & CC_EXPANDEXPL) ? 'Y' : 'X'); printif(cc->ylist, 'y'); printif(cc->prefix, 'P'); diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c --- os/Zle/zle_tricky.c Fri Mar 5 14:23:32 1999 +++ Src/Zle/zle_tricky.c Fri Mar 5 14:37:42 1999 @@ -6501,51 +6501,48 @@ maketildelist(); addwhat = oaw; } + if (cc->widget) + callcompfunc(os, cc->widget); if (cc->func) { - if (cc->func[0] == '_') - /* The function should be called like a completion widget. */ - callcompfunc(os, cc->func + 1); - else { - /* This handles the compctl -K flag. */ - List list; - char **r; - int lv = lastval; + /* This handles the compctl -K flag. */ + List list; + char **r; + int lv = lastval; - /* Get the function. */ - if ((list = getshfunc(cc->func)) != &dummy_list) { - /* We have it, so build a argument list. */ - LinkList args = newlinklist(); - int osc = sfcontext; + /* Get the function. */ + if ((list = getshfunc(cc->func)) != &dummy_list) { + /* We have it, so build a argument list. */ + LinkList args = newlinklist(); + int osc = sfcontext; - addlinknode(args, cc->func); + addlinknode(args, cc->func); - if (delit) { - p = dupstrpfx(os, ooffs); - untokenize(p); - addlinknode(args, p); - p = dupstring(os + ooffs); - untokenize(p); - addlinknode(args, p); - } else { - addlinknode(args, lpre); - addlinknode(args, lsuf); - } - - /* This flag allows us to use read -l and -c. */ - if (incompfunc != 1) - incompctlfunc = 1; - sfcontext = SFC_COMPLETE; - /* Call the function. */ - doshfunc(cc->func, list, args, 0, 1); - sfcontext = osc; - incompctlfunc = 0; - /* And get the result from the reply parameter. */ - if ((r = get_user_var("reply"))) - while (*r) - addmatch(*r++, NULL); + if (delit) { + p = dupstrpfx(os, ooffs); + untokenize(p); + addlinknode(args, p); + p = dupstring(os + ooffs); + untokenize(p); + addlinknode(args, p); + } else { + addlinknode(args, lpre); + addlinknode(args, lsuf); } - lastval = lv; + + /* This flag allows us to use read -l and -c. */ + if (incompfunc != 1) + incompctlfunc = 1; + sfcontext = SFC_COMPLETE; + /* Call the function. */ + doshfunc(cc->func, list, args, 0, 1); + sfcontext = osc; + incompctlfunc = 0; + /* And get the result from the reply parameter. */ + if ((r = get_user_var("reply"))) + while (*r) + addmatch(*r++, NULL); } + lastval = lv; } if (cc->mask & (CC_JOBS | CC_RUNNING | CC_STOPPED)) { /* Get job names. */ diff -u od/Zsh/compctl.yo Doc/Zsh/compctl.yo --- od/Zsh/compctl.yo Thu Mar 4 10:59:44 1999 +++ Doc/Zsh/compctl.yo Fri Mar 5 14:45:09 1999 @@ -124,9 +124,9 @@ list([ tt(-fcFBdeaRGovNAIOPZEnbjrzu/) ]) list([ tt(-k) var(array) ] [ tt(-g) var(globstring) ] \ [ tt(-s) var(subststring) ]) -list([ tt(-K) var(function) ] [ tt(-H) var(num pattern) ]) +list([ tt(-K) var(function) ] [ tt(-i) var(function) ]) list([ tt(-Q) ] [ tt(-P) var(prefix) ] [ tt(-S) var(suffix) ]) -list([ tt(-W) var(file-prefix) ]) +list([ tt(-W) var(file-prefix) ] [ tt(-H) var(num pattern) ]) list([ tt(-q) ] [ tt(-X) var(explanation) ] [ tt(-Y) var(explanation) ]) list([ tt(-y) var(func-or-var) ] [ tt(-l) var(cmd) ] [ tt(-U) ]) list([ tt(-t) var(continue) ] [ tt(-J) var(name) ] [ tt(-V) var(name) ]) @@ -300,12 +300,13 @@ completes only logged-on users after `tt(talk)'. Note that `tt(whoson)' must return an array, so `tt(reply=`users`)' would be incorrect. - -If the given name starts with an underscore, the function is called in -the same way as a comompletion widget, see +) +item(tt(-i) var(function))( +Like tt(-K), but the function is invoked in a context like that for +completion widgets, see ifzman(zmanref(zshzle))\ ifnzman(noderef(The zle Module))\ -) for more information. +for more information. ) item(tt(-H) var(num pattern))( The possible completions are taken from the last var(num) history -- Sven Wischnowsky wischnow@informatik.hu-berlin.de