mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
40269: handle option exclusion within current word for clumped options
This replaces the change made in 13999 with an alternative approach.
This commit is contained in:
parent
8be732cbcc
commit
c2b7c5abbe
3 changed files with 37 additions and 19 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2017-01-05 Oliver Kiddle <opk@zsh.org>
|
||||||
|
|
||||||
|
* 40269: Src/Zle/computil.c, Test/Y03arguments.ztst:
|
||||||
|
handle option exclusion within current word for clumped options
|
||||||
|
|
||||||
2017-01-04 Oliver Kiddle <opk@zsh.org>
|
2017-01-04 Oliver Kiddle <opk@zsh.org>
|
||||||
|
|
||||||
* 40227: Src/Zle/computil.c, Test/Y03arguments.ztst: new approach
|
* 40227: Src/Zle/computil.c, Test/Y03arguments.ztst: new approach
|
||||||
|
|
|
@ -1790,16 +1790,17 @@ ca_get_arg(Cadef d, int n)
|
||||||
* opts: if set, all options excluded leaving only nornal/rest arguments */
|
* opts: if set, all options excluded leaving only nornal/rest arguments */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ca_inactive(Cadef d, char **xor, int cur, int opts, char *optname)
|
ca_inactive(Cadef d, char **xor, int cur, int opts)
|
||||||
{
|
{
|
||||||
if ((xor || opts) && cur <= compcurrent) {
|
if ((xor || opts) && cur <= compcurrent) {
|
||||||
Caopt opt;
|
Caopt opt;
|
||||||
char *x;
|
char *x;
|
||||||
int sl = (d->set ? (int)strlen(d->set) : -1), set = 0;
|
int sl = (d->set ? (int)strlen(d->set) : -1), set = 0;
|
||||||
|
/* current word could be a prefix of a longer one so only do
|
||||||
|
* exclusions for single-letter options (for option clumping) */
|
||||||
|
int single = (cur == compcurrent);
|
||||||
|
|
||||||
for (; (x = (opts ? "-" : *xor)); xor++) {
|
for (; (x = (opts ? "-" : *xor)); xor++) {
|
||||||
if (optname && optname[0] == x[0] && strcmp(optname, x))
|
|
||||||
continue;
|
|
||||||
set = 0;
|
set = 0;
|
||||||
if (sl > 0) {
|
if (sl > 0) {
|
||||||
if (strpfx(d->set, x)) {
|
if (strpfx(d->set, x)) {
|
||||||
|
@ -1809,7 +1810,7 @@ ca_inactive(Cadef d, char **xor, int cur, int opts, char *optname)
|
||||||
Caopt p;
|
Caopt p;
|
||||||
|
|
||||||
for (p = d->opts; p; p = p->next)
|
for (p = d->opts; p; p = p->next)
|
||||||
if (p->set)
|
if (p->set && !(single && *p->name && p->name[1] && p->name[2]))
|
||||||
p->active = 0;
|
p->active = 0;
|
||||||
|
|
||||||
x = ":";
|
x = ":";
|
||||||
|
@ -1831,7 +1832,7 @@ ca_inactive(Cadef d, char **xor, int cur, int opts, char *optname)
|
||||||
Caopt p;
|
Caopt p;
|
||||||
|
|
||||||
for (p = d->opts; p; p = p->next)
|
for (p = d->opts; p; p = p->next)
|
||||||
if (!set || p->set)
|
if ((!set || p->set) && !(single && *p->name && p->name[1] && p->name[2]))
|
||||||
p->active = 0;
|
p->active = 0;
|
||||||
} else if (x[0] == '*' && !x[1]) {
|
} else if (x[0] == '*' && !x[1]) {
|
||||||
if (d->rest && (!set || d->rest->set))
|
if (d->rest && (!set || d->rest->set))
|
||||||
|
@ -1845,7 +1846,8 @@ ca_inactive(Cadef d, char **xor, int cur, int opts, char *optname)
|
||||||
|
|
||||||
if (a && a->num == n && (!set || a->set))
|
if (a && a->num == n && (!set || a->set))
|
||||||
a->active = 0;
|
a->active = 0;
|
||||||
} else if ((opt = ca_get_opt(d, x, 1, NULL)) && (!set || opt->set))
|
} else if ((opt = ca_get_opt(d, x, 1, NULL)) && (!set || opt->set) &&
|
||||||
|
!(single && *opt->name && opt->name[1] && opt->name[2]))
|
||||||
opt->active = 0;
|
opt->active = 0;
|
||||||
|
|
||||||
if (opts)
|
if (opts)
|
||||||
|
@ -2029,9 +2031,9 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
|
||||||
remnulargs(line);
|
remnulargs(line);
|
||||||
untokenize(line);
|
untokenize(line);
|
||||||
|
|
||||||
ca_inactive(d, argxor, cur, 0, NULL);
|
ca_inactive(d, argxor, cur, 0);
|
||||||
if ((d->flags & CDF_SEP) && cur != compcurrent && !strcmp(line, "--")) {
|
if ((d->flags & CDF_SEP) && cur != compcurrent && !strcmp(line, "--")) {
|
||||||
ca_inactive(d, NULL, cur, 1, NULL);
|
ca_inactive(d, NULL, cur, 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2107,8 +2109,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
|
||||||
if (!state.oargs[state.curopt->num])
|
if (!state.oargs[state.curopt->num])
|
||||||
state.oargs[state.curopt->num] = znewlinklist();
|
state.oargs[state.curopt->num] = znewlinklist();
|
||||||
|
|
||||||
ca_inactive(d, state.curopt->xor, cur, 0,
|
ca_inactive(d, state.curopt->xor, cur, 0);
|
||||||
(cur == compcurrent ? state.curopt->name : NULL));
|
|
||||||
|
|
||||||
/* Collect the argument strings. Maybe. */
|
/* Collect the argument strings. Maybe. */
|
||||||
|
|
||||||
|
@ -2161,8 +2162,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
|
||||||
if (!state.oargs[tmpopt->num])
|
if (!state.oargs[tmpopt->num])
|
||||||
state.oargs[tmpopt->num] = znewlinklist();
|
state.oargs[tmpopt->num] = znewlinklist();
|
||||||
|
|
||||||
ca_inactive(d, tmpopt->xor, cur, 0,
|
ca_inactive(d, tmpopt->xor, cur, 0);
|
||||||
(cur == compcurrent ? tmpopt->name : NULL));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (state.def &&
|
if (state.def &&
|
||||||
|
@ -2190,7 +2190,7 @@ ca_parse_line(Cadef d, Cadef all, int multi, int first)
|
||||||
(!napat || cur <= compcurrent || !pattry(napat, line))) {
|
(!napat || cur <= compcurrent || !pattry(napat, line))) {
|
||||||
/* Otherwise it's a normal argument. */
|
/* Otherwise it's a normal argument. */
|
||||||
if (napat && cur <= compcurrent)
|
if (napat && cur <= compcurrent)
|
||||||
ca_inactive(d, NULL, cur + 1, 1, NULL);
|
ca_inactive(d, NULL, cur + 1, 1);
|
||||||
|
|
||||||
arglast = 1;
|
arglast = 1;
|
||||||
/* if this is the first normal arg after an option, may have been
|
/* if this is the first normal arg after an option, may have been
|
||||||
|
|
|
@ -479,12 +479,9 @@
|
||||||
F:shouldn't offer -b as it is already on the command-line
|
F:shouldn't offer -b as it is already on the command-line
|
||||||
|
|
||||||
tst_arguments -s : '(-d)-a' -b -c -d
|
tst_arguments -s : '(-d)-a' -b -c -d
|
||||||
comptest $'tst -ab\t -\t\eb\eb \C-b-\t'
|
comptest $'tst -ab\t\C-h -\t\eb\eb \C-b-\t'
|
||||||
0:exclusion with clumped options, in, after and before
|
0:exclusion with clumped options, in, after and before
|
||||||
>line: {tst -ab}{}
|
>line: {tst -abc}{}
|
||||||
>DESCRIPTION:{option}
|
|
||||||
>NO:{-c}
|
|
||||||
>NO:{-d}
|
|
||||||
>line: {tst -ab -c }{}
|
>line: {tst -ab -c }{}
|
||||||
>line: {tst -}{ -ab -c}
|
>line: {tst -}{ -ab -c}
|
||||||
>DESCRIPTION:{option}
|
>DESCRIPTION:{option}
|
||||||
|
@ -492,7 +489,23 @@ F:shouldn't offer -b as it is already on the command-line
|
||||||
>NO:{-b}
|
>NO:{-b}
|
||||||
>NO:{-c}
|
>NO:{-c}
|
||||||
>NO:{-d}
|
>NO:{-d}
|
||||||
F:the first tab press shouldn't offer -d since -a is on the command line
|
|
||||||
|
tst_arguments -s '(-conf)-c' '-conf' '-f' '(-)--long' --longer
|
||||||
|
comptest $'tst -c\t\C-h-long\t'
|
||||||
|
0:don't prematurely exclude option that current word is a prefix of
|
||||||
|
>line: {tst -c}{}
|
||||||
|
>DESCRIPTION:{option}
|
||||||
|
>NO:{-conf}
|
||||||
|
>NO:{-f}
|
||||||
|
>line: {tst --long}{}
|
||||||
|
>DESCRIPTION:{option}
|
||||||
|
>NO:{--long}
|
||||||
|
>NO:{--longer}
|
||||||
|
|
||||||
|
tst_arguments -s '(set)-c' - set '-conf' '-f'
|
||||||
|
comptest $'tst -c\t'
|
||||||
|
0:don't prematurely exclude option that current word is a prefix of (with sets)
|
||||||
|
>line: {tst -conf }{}
|
||||||
|
|
||||||
tst_arguments -s : -ad '(-d)-a' -b -ca -d
|
tst_arguments -s : -ad '(-d)-a' -b -ca -d
|
||||||
comptest $'tst -ad\t-b\t'
|
comptest $'tst -ad\t-b\t'
|
||||||
|
|
Loading…
Reference in a new issue