Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Strange _values completion on accept-and-menu-complete and menu selection
- X-seq: zsh-workers 20622
- From: Andrey Borzenkov <arvidjaar@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: Strange _values completion on accept-and-menu-complete and menu selection
- Date: Mon, 13 Dec 2004 00:06:56 +0300
- In-reply-to: <Pine.LNX.4.61.0412120925560.16206@xxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <200412111311.27916.arvidjaar@xxxxxxx> <200412121915.34004.arvidjaar@xxxxxxx> <Pine.LNX.4.61.0412120925560.16206@xxxxxxxxxxxxxxxxxx>
On Sunday 12 December 2004 20:51, Bart Schaefer wrote:
> On Sun, 12 Dec 2004, Andrey Borzenkov wrote:
> > I attach prototype patch - it adds compstate element that tells
> > accept_last to skip suffix removal. It can be used in more general case
> > than just _values - what I am not sure how and when this is to be set.
>
> I wonder if perhaps another state name would be better. "Stay in word" is
> a directive, whereas everything else in compstate is, well, state data.
>
> What if it were compstate[compound_word] and the value is the separator
> character to insert? (Or perhaps two characters, corresponding to
> "compvalues -s" and "compvalues -S" in that order.)
>
> Normally compstate[compound_word] would be unset, but "compvalues -i"
> would set it based on the parse.
I still believe this is more general and should not be limited to _values
only. Also -S does not seem to be needed here.
Here is updated patch (which also fixes initialization problem). It makes
parameter compound_word as scalar but currently tests only for empty value
(is it correct way to test for it BTW?) Setting compstate[compound_word] to
any string in completion function will stop accept_last from removing suffix
(actually, altering string in any way). This also changes _values to set it
as appropriate.
This still has problems in completing nested calls to _values (should it
work?) Try this example:
function _foo_val () {
_values -s : "subvalues" baz bad bam
}
function _foo () {
_values -s , -S = "test values" \
foo \
"bar:bar values:_foo_val"
}
compdef _foo foo
regards
-andrey
Index: Completion/Base/Utility/_values
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Base/Utility/_values,v
retrieving revision 1.8
diff -u -p -r1.8 _values
--- Completion/Base/Utility/_values 16 Apr 2002 07:55:49 -0000 1.8
+++ Completion/Base/Utility/_values 12 Dec 2004 20:44:45 -0000
@@ -10,10 +10,13 @@ zparseopts -D -E -a garbage C=usecc O:=s
if compvalues -i "$@"; then
local noargs args opts descr action expl sep argsep subc test='*'
- local oldcontext="$curcontext"
+ local oldcontext="$curcontext" compound=$compstate[compound]
compvalues -S argsep
- compvalues -s sep && [[ -n "$sep" ]] && test="[^${(q)sep}]#"
+ compvalues -s sep && [[ -n "$sep" ]] && {
+ test="[^${(q)sep}]#"
+ compstate[compound_word]=yes
+ }
if ! compvalues -D descr action; then
@@ -148,6 +151,7 @@ if compvalues -i "$@"; then
fi
fi
+ compstate[compound]=$compound
curcontext="$oldcontext"
[[ nm -ne "$compstate[nmatches]" ]]
Index: Src/Zle/comp.h
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/comp.h,v
retrieving revision 1.14
diff -u -p -r1.14 comp.h
--- Src/Zle/comp.h 21 May 2002 08:07:51 -0000 1.14
+++ Src/Zle/comp.h 12 Dec 2004 20:44:46 -0000
@@ -375,9 +375,11 @@ typedef void (*CLPrintFunc)(Cmgroup, Cma
#define CP_QUOTES (1 << CPN_QUOTES)
#define CPN_IGNORED 25
#define CP_IGNORED (1 << CPN_IGNORED)
+#define CPN_COMPOUND 26
+#define CP_COMPOUND (1 << CPN_COMPOUND)
-#define CP_KEYPARAMS 26
-#define CP_ALLKEYS ((unsigned int) 0x3ffffff)
+#define CP_KEYPARAMS 27
+#define CP_ALLKEYS ((unsigned int) 0x7ffffff)
/* Hooks. */
Index: Src/Zle/compcore.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compcore.c,v
retrieving revision 1.68
diff -u -p -r1.68 compcore.c
--- Src/Zle/compcore.c 5 Nov 2004 16:20:24 -0000 1.68
+++ Src/Zle/compcore.c 12 Dec 2004 20:44:49 -0000
@@ -764,6 +764,8 @@ callcompfunc(char *s, char *fn)
compoldlist = compoldins = "";
compoldlist = ztrdup(compoldlist);
compoldins = ztrdup(compoldins);
+ zsfree(compcompound);
+ compcompound = ztrdup("");
incompfunc = 1;
startparamscope();
Index: Src/Zle/complete.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/complete.c,v
retrieving revision 1.27
diff -u -p -r1.27 complete.c
--- Src/Zle/complete.c 7 Dec 2004 16:55:11 -0000 1.27
+++ Src/Zle/complete.c 12 Dec 2004 20:44:49 -0000
@@ -70,7 +70,8 @@ char *compiprefix,
*comptoend,
*compoldlist,
*compoldins,
- *compvared;
+ *compvared,
+ *compcompound;
/**/
Param *comprpms, *compkpms;
@@ -1018,6 +1019,7 @@ static struct compparam compkparams[] =
{ "list_lines", PM_INTEGER | PM_READONLY, NULL, GSU(listlines_gsu) },
{ "all_quotes", PM_SCALAR | PM_READONLY, VAL(compqstack), NULL },
{ "ignored", PM_INTEGER | PM_READONLY, VAL(compignored), NULL },
+ { "compound_word", PM_SCALAR, VAL(compcompound), NULL },
{ NULL, 0, NULL, NULL }
};
@@ -1428,7 +1430,7 @@ setup_(UNUSED(Module m))
compquoting = comprestore = complist = compinsert =
compexact = compexactstr = comppatmatch = comppatinsert =
complastprompt = comptoend = compoldlist = compoldins =
- compvared = compqstack = NULL;
+ compvared = compqstack = compcompound = NULL;
complastprefix = ztrdup("");
complastsuffix = ztrdup("");
complistmax = 0;
@@ -1508,6 +1510,7 @@ finish_(UNUSED(Module m))
zsfree(compoldlist);
zsfree(compoldins);
zsfree(compvared);
+ zsfree(compcompound);
hascompmod = 0;
Index: Src/Zle/compresult.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/compresult.c,v
retrieving revision 1.52
diff -u -p -r1.52 compresult.c
--- Src/Zle/compresult.c 12 Jul 2004 10:05:52 -0000 1.52
+++ Src/Zle/compresult.c 12 Dec 2004 20:44:49 -0000
@@ -1243,14 +1243,16 @@ accept_last(void)
int l;
cs = minfo.pos + minfo.len + minfo.insc;
- iremovesuffix(' ', 1);
+ if (!compcompound || strlen(compcompound) == 0)
+ iremovesuffix(' ', 1);
l = cs;
cs = minfo.pos + minfo.len + minfo.insc - (*(minfo.cur))->qisl;
if (cs < l)
foredel(l - cs);
else if (cs > ll)
cs = ll;
- inststrlen(" ", 1, 1);
+ if (!compcompound || strlen(compcompound) == 0)
+ inststrlen(" ", 1, 1);
minfo.insc = minfo.len = 0;
minfo.pos = cs;
minfo.we = 1;
Messages sorted by:
Reverse Date,
Date,
Thread,
Author