Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: completion in vared
- X-seq: zsh-workers 6152
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: Re: completion in vared
- Date: Thu, 29 Apr 1999 11:05:53 +0200 (MET DST)
- In-reply-to: Peter Stephenson's message of Wed, 28 Apr 1999 17:00:43 +0200
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
Peter Stephenson wrote:
> Any thoughts about completion in vared? Would it be possible to get it to
> start completion with the context set to _value or _array_value, and
> compstate[parameter] set? (Maybe even a special compstate flag, but I'm
> not particular about that and don't necessarily have a use for it.)
I had thought about this some time ago, then forgot it again. And I
was mostly thinking about something like what Bart suggested, but...
Well, I wouldn't like it to unconditionally set compstate[context] to
(array_|)value because sometimes one might want to let the user edit a
command line which is then `eval'ed or something like that. Then
normal command completion would be nice, of course.
*But* we probably should allow the completion widget writer to find
out that vared is active. So the patch below adds compstate[vared]
which is set to the argument that is currently varedited. With that
one could do (e.g. in the function for the -first- context):
if [[ -n $compstate[vared] ]]; then
if [[ $compstate[vared] = *\[* ]]; then
compstate[parameter]=${compstate[vared]%%\[*}
compstate[context]=value
else
compstate[parameter]=$compstate[vared]
if [[ ${(tP)compstate[vared]} = *(array|assoc)* ]]; then
compstate[context]=array_value
else
compstate[context]=value
fi
fi
return
fi
to set up compstate accordingly. (This is another example of how a
example _first function might be useful. Does anyone have one? Any
other suggestions about what we might put there? (If I were to add it,
I would put everything in it in comments, not disturbing completion
but explaining what can be done.))
Are there other places where completion might get called from (other
than normal line editing and vared)? If so, we should change the
key/value to be able to reflect these other circumstances.
But in reply to Bart: I, too, had thought about a special variable
which is tested by the completion (shell-)code, and, if it is set,
it's value is used as the name of the context to use. So I would put
it into _complete and it would allow us to use the normal context-
distribution and -definition mechanism. Hm, does this sound ok? Any
suggestions for the name?
Bye
Sven
Sidenote: The code uses a mask to say which of the special completion
parameters should be set or unset. With compstate[vared] we
have reached 32. If anyone comes up with an idea for another
key, I'll have to re-write a bit more of the code (seven
bits can be freed, after that I would have to change even
more).
P.S.: The patch also contains two small fixes where I forgot to
include the mask for ISUFFIX. IF a function usetted that it
wasn't restored after function exit again (well, the value was
restored all right, but it didn't re-appear).
diff -u os/Zle/comp.h Src/Zle/comp.h
--- os/Zle/comp.h Thu Apr 29 10:14:47 1999
+++ Src/Zle/comp.h Thu Apr 29 10:24:33 1999
@@ -331,7 +331,8 @@
#define CP_TOEND (1 << 28)
#define CP_OLDLIST (1 << 29)
#define CP_OLDINS (1 << 30)
+#define CP_VARED (1 << 31)
-#define CP_NUM 31
+#define CP_NUM 32
-#define CP_ALLMASK ((int) ((((unsigned int) 1) << CP_NUM) - 1))
+#define CP_ALLMASK ((unsigned int) 0xffffffff)
diff -u os/Zle/comp1.c Src/Zle/comp1.c
--- os/Zle/comp1.c Thu Apr 29 10:14:47 1999
+++ Src/Zle/comp1.c Thu Apr 29 10:26:28 1999
@@ -129,7 +129,8 @@
*complastprompt,
*comptoend,
*compoldlist,
- *compoldins;
+ *compoldins,
+ *compvared;
/**/
Param *comppms;
@@ -445,7 +446,7 @@
compquoting = comprestore = complist = compinsert =
compexact = compexactstr = comppatmatch = comppatinsert =
compforcelist = complastprompt = comptoend =
- compoldlist = compoldins = NULL;
+ compoldlist = compoldins = compvared = NULL;
makecompparamsptr = NULL;
comp_setunsetptr = NULL;
return 0;
@@ -497,6 +498,7 @@
zsfree(comptoend);
zsfree(compoldlist);
zsfree(compoldins);
+ zsfree(compvared);
return 0;
}
diff -u os/Zle/compctl.c Src/Zle/compctl.c
--- os/Zle/compctl.c Thu Apr 29 10:14:47 1999
+++ Src/Zle/compctl.c Thu Apr 29 10:38:32 1999
@@ -2173,6 +2173,7 @@
{ "to_end", PM_SCALAR, VAL(comptoend), NULL, NULL },
{ "old_list", PM_SCALAR, VAL(compoldlist), NULL, NULL },
{ "old_insert", PM_SCALAR, VAL(compoldins), NULL, NULL },
+ { "vared", PM_SCALAR, VAL(compvared), NULL, NULL },
{ NULL, 0, NULL, NULL, NULL }
};
@@ -2316,7 +2317,7 @@
/**/
void
-comp_setunset(int set, int unset)
+comp_setunset(unsigned int set, unsigned int unset)
{
Param *p;
@@ -2342,11 +2343,11 @@
else {
char *orest, *opre, *osuf, *oipre, *oisuf, **owords;
long ocur;
- int unset = 0, m, sm;
+ unsigned int unset = 0, m, sm;
Param *pp;
m = CP_WORDS | CP_CURRENT | CP_PREFIX | CP_SUFFIX |
- CP_IPREFIX | CP_RESTORE;
+ CP_IPREFIX | CP_ISUFFIX | CP_RESTORE;
for (pp = comppms, sm = 1; m; pp++, m >>= 1, sm <<= 1) {
if ((m & 1) && ((*pp)->flags & PM_UNSET))
unset |= sm;
@@ -2381,7 +2382,8 @@
} LASTALLOC;
comp_setunset(CP_COMPSTATE |
(~unset & (CP_WORDS | CP_CURRENT | CP_PREFIX |
- CP_SUFFIX | CP_IPREFIX | CP_RESTORE)),
+ CP_SUFFIX | CP_IPREFIX | CP_ISUFFIX |
+ CP_RESTORE)),
unset);
} else
comp_setunset(CP_COMPSTATE | (~unset & CP_RESTORE),
diff -u os/Zle/zle_main.c Src/Zle/zle_main.c
--- os/Zle/zle_main.c Thu Apr 29 10:14:47 1999
+++ Src/Zle/zle_main.c Thu Apr 29 10:36:33 1999
@@ -656,14 +656,18 @@
initmodifier(&zmod);
}
+/* this exports the argument we are currently vared'iting if != NULL */
+
+/**/
+char *varedarg;
+
/* vared: edit (literally) a parameter value */
/**/
static int
bin_vared(char *name, char **args, char *ops, int func)
{
- char *s;
- char *t;
+ char *s, *t, *ova = varedarg;
Value v;
Param pm = 0;
int create = 0;
@@ -753,7 +757,9 @@
PERMALLOC {
pushnode(bufstack, ztrdup(s));
} LASTALLOC;
+ varedarg = *args;
t = (char *) zleread(p1, p2, ops['h'] ? ZLRF_HISTORY : 0);
+ varedarg = ova;
if (!t || errflag) {
/* error in editing */
errflag = 0;
@@ -926,6 +932,8 @@
/* initialise the keymap system */
init_keymaps();
+
+ varedarg = NULL;
return 0;
}
diff -u os/Zle/zle_tricky.c Src/Zle/zle_tricky.c
--- os/Zle/zle_tricky.c Thu Apr 29 10:14:48 1999
+++ Src/Zle/zle_tricky.c Thu Apr 29 10:40:14 1999
@@ -4280,14 +4280,22 @@
if ((list = getshfunc(fn)) != &dummy_list) {
char **p, *tmp;
- int set, aadd = 0, usea = 1, icf = incompfunc, osc = sfcontext;
+ int aadd = 0, usea = 1, icf = incompfunc, osc = sfcontext;
+ unsigned int set;
Param *ocpms = comppms;
comppms = (Param *) zalloc(CP_NUM * sizeof(Param));
- set = -1 & ~(CP_PARAMETER | CP_REDIRECT | CP_QUOTE | CP_QUOTING |
- CP_EXACTSTR | CP_FORCELIST | CP_OLDLIST | CP_OLDINS |
- (useglob ? 0 : CP_PATMATCH));
+ set = CP_ALLMASK &
+ ~(CP_PARAMETER | CP_REDIRECT | CP_QUOTE | CP_QUOTING |
+ CP_EXACTSTR | CP_FORCELIST | CP_OLDLIST | CP_OLDINS |
+ (useglob ? 0 : CP_PATMATCH));
+ zsfree(compvared);
+ if (varedarg) {
+ compvared = ztrdup(varedarg);
+ set |= CP_VARED;
+ } else
+ compvared = ztrdup("");
if (!*complastprompt)
set &= ~CP_LASTPROMPT;
zsfree(compcontext);
diff -u od/Zsh/compwid.yo Doc/Zsh/compwid.yo
--- od/Zsh/compwid.yo Wed Apr 28 16:24:22 1999
+++ Doc/Zsh/compwid.yo Thu Apr 29 11:05:07 1999
@@ -140,6 +140,12 @@
)
enditem()
)
+item(tt(vared))(
+If completion is called while editing a line using the tt(vared)
+builtin, the value of this key is set to the name of the parameter
+given as argument to tt(vared). If tt(vared) is not currently used,
+this key is unset.
+)
item(tt(parameter))(
The name of the parameter when completing in a subscript or in the
value of a parameter assignment.
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author