From: Sven Wischnowsky <wischnow@informatik.hu-berlin.de>
To: zsh-workers@sunsite.auc.dk
Subject: PATCH: suggestion for new condition
Date: Mon, 25 Jan 1999 11:40:18 +0100 (MET) [thread overview]
Message-ID: <199901251040.LAA12723@beta.informatik.hu-berlin.de> (raw)
Dunno if you'll like this one.
I sometimes missed an easy way to check if a certain parameter was set
or of a specific type. The patch below adds the condition `-v' for
this:
`-v param' is true if the parameter `param' is set
`-v param type' is true if paramater `param' is set and of the
given type; `type' may be any of: scalar, array,
integer, association, left, right, right-blank,
right-zero, upper, readonly, tag, export, and
unique
Changing these names, adding single character abbreviations, and
allowing `-v' to take more than one type wouldn't be too hard to
implement, but I first wanted to know if anyone else likes it.
Except for the hunks in `new-completion-examples' the patch should
work with pws-[1-4] (or pws-[2-4]). The stuff in
`new-completion-examples' fixes a bug for the completion for `wait' I
just discovered and makes the new condition be used (e.g. for
completing keys in subscripts of associative arrays).
Bye
Sven
*** os/cond.c Mon Jan 25 10:22:39 1999
--- Src/cond.c Mon Jan 25 10:27:33 1999
***************
*** 114,119 ****
--- 114,163 ----
return (!!strlen(c->left));
case 'o':
return (optison(c->left));
+ case 'v':
+ {
+ Param pm = (Param) paramtab->getnode(paramtab,
+ (char *) c->left);
+
+ if (c->right) {
+ char *tn = (char *) c->right;
+ int t = (pm ? pm->flags : 0);
+
+ if (!strcmp(tn, "scalar"))
+ t = (PM_TYPE(t) == PM_SCALAR);
+ else if (!strcmp(tn, "array"))
+ t = (PM_TYPE(t) == PM_ARRAY);
+ else if (!strcmp(tn, "integer"))
+ t = (PM_TYPE(t) == PM_INTEGER);
+ else if (!strcmp(tn, "association"))
+ t = (PM_TYPE(t) == PM_HASHED);
+ else if (!strcmp(tn, "left"))
+ t = (t & PM_LEFT);
+ else if (!strcmp(tn, "right"))
+ t = (t & (PM_RIGHT_B | PM_RIGHT_Z));
+ else if (!strcmp(tn, "right-blank"))
+ t = (t & PM_RIGHT_B);
+ else if (!strcmp(tn, "right-zero"))
+ t = (t & PM_RIGHT_Z);
+ else if (!strcmp(tn, "upper"))
+ t = (t & PM_UPPER);
+ else if (!strcmp(tn, "readonly"))
+ t = (t & PM_READONLY);
+ else if (!strcmp(tn, "tag"))
+ t = (t & PM_TAGGED);
+ else if (!strcmp(tn, "export"))
+ t = (t & PM_EXPORTED);
+ else if (!strcmp(tn, "unique"))
+ t = (t & PM_UNIQUE);
+ else {
+ zerr("unrecognized paramter type: `%s'", tn, 0);
+
+ return 0;
+ }
+ return (pm ? t : 0);
+ }
+ return !!pm;
+ }
case 'p':
return (S_ISFIFO(dostat(c->left)));
case 'r':
*** os/parse.c Mon Jan 25 10:22:41 1999
--- Src/parse.c Mon Jan 25 10:27:33 1999
***************
*** 1332,1338 ****
n->left = (void *) b;
if (a[0] != '-' || !a[1])
COND_ERROR("parse error: condition expected: %s", a);
! else if (!a[2] && strspn(a+1, "abcdefgknoprstuwxzhLONGS") == 1)
n->type = a[1];
else {
char *d[2];
--- 1332,1338 ----
n->left = (void *) b;
if (a[0] != '-' || !a[1])
COND_ERROR("parse error: condition expected: %s", a);
! else if (!a[2] && strspn(a+1, "abcdefgknoprstuvwxzhLONGS") == 1)
n->type = a[1];
else {
char *d[2];
***************
*** 1393,1407 ****
n->right = (void *) arrdup(d);
}
} else if (a[0] == '-' && a[1]) {
! char *d[3];
! n->ntype = NT_SET(N_COND, NT_STR, NT_STR | NT_ARR, 0, 0);
! n->type = COND_MOD;
! n->left = (void *) a;
! d[0] = b;
! d[1] = c;
! d[2] = NULL;
! n->right = (void *) arrdup(d);
} else
COND_ERROR("condition expected: %s", b);
return n;
--- 1393,1413 ----
n->right = (void *) arrdup(d);
}
} else if (a[0] == '-' && a[1]) {
! if (a[1] == 'v' && !a[2]) {
! n->ntype = NT_SET(N_COND, NT_STR, NT_STR, 0, 0);
! n->type = 'v';
! n->left = (void *) b;
! } else {
! char *d[3];
! n->ntype = NT_SET(N_COND, NT_STR, NT_STR | NT_ARR, 0, 0);
! n->type = COND_MOD;
! n->left = (void *) a;
! d[0] = b;
! d[1] = c;
! d[2] = NULL;
! n->right = (void *) arrdup(d);
! }
} else
COND_ERROR("condition expected: %s", b);
return n;
*** od/Zsh/cond.yo Mon Jan 25 10:22:12 1999
--- Doc/Zsh/cond.yo Mon Jan 25 10:27:45 1999
***************
*** 46,51 ****
--- 46,99 ----
may be a single character, in which case it is a single letter option name.
(See noderef(Specifying Options).)
)
+ item(tt(-v) var(name) [ var(type) ])(
+ true if a parameter var(name) exists. If an optional var(type) is
+ given this conditions is true only if the parameter is of the given
+ type. Currently understood types are:
+
+ startitem()
+ item(tt(scalar))(
+ for scalar parameters
+ )
+ item(tt(array))(
+ for arrays
+ )
+ item(tt(integer))(
+ for integer parameters
+ )
+ item(tt(associative))(
+ for associative arrays
+ )
+ item(tt(left))(
+ for left justified parameters
+ )
+ item(tt(right))(
+ for right justified parameters
+ )
+ item(tt(right-blank))(
+ for right justified parameters with leading blanks
+ )
+ item(tt(right-zero))(
+ for right justified parameters with leading zeros
+ )
+ item(tt(upper))(
+ for parameters whose values are converted to all upper case when they
+ are expanded
+ )
+ item(tt(readonly))(
+ for readonly parameters
+ )
+ item(tt(tagg))(
+ for tagged parameters
+ )
+ item(tt(export))(
+ for exported parameters
+ )
+ item(tt(unique))(
+ for arrays which keep only the first occurrence of duplicated values
+ )
+ enditem()
+ )
item(tt(-p) var(file))(
true if var(file) exists and is a FIFO special file (named pipe).
)
*** om/new-completion-examples Mon Jan 25 11:24:35 1999
--- Misc/new-completion-examples Mon Jan 25 11:37:00 1999
***************
*** 43,49 ****
shift
autoload "$1"
fi
! if [[ ${+patcomps} == 1 ]] then
patcomps=("$patcomps[@]" "$2 $1" )
else
patcomps=( "$2 $1" )
--- 43,49 ----
shift
autoload "$1"
fi
! if [[ -v patcomps ]] then
patcomps=("$patcomps[@]" "$2 $1" )
else
patcomps=( "$2 $1" )
***************
*** 75,87 ****
# the arguments from the command line as its arguments.
call-complete() {
! local var
!
! eval var\=\$\{\+$1\}
! if [[ "$var" == 0 ]] then
! "$@"
! else
eval complist \$\{${1}\[\@\]\}
fi
}
--- 75,84 ----
# the arguments from the command line as its arguments.
call-complete() {
! if [[ -v $1 ]] then
eval complist \$\{${1}\[\@\]\}
+ else
+ "$@"
fi
}
***************
*** 324,330 ****
defcomp __subscr --subscr--
__subscr() {
compalso --math-- "$@"
! # ...probably other stuff
}
# Do sub-completion for pre-command modifiers.
--- 321,327 ----
defcomp __subscr --subscr--
__subscr() {
compalso --math-- "$@"
! [[ -v $COMMAND association ]] && eval complist -k \"\(\$\{\(k\)$COMMAND\}\)\"
}
# Do sub-completion for pre-command modifiers.
***************
*** 368,376 ****
defcomp __bjobs bg
__bjobs=(-z -P '%')
- defcomp wait
- __wait=(-j -P '%' + -s '`ps -x | tail +2 | cut -c1-5`')
-
defcomp __arrays shift
__arrays=(-A)
--- 365,370 ----
***************
*** 536,541 ****
--- 530,541 ----
complist -P '%' -j
complist -y killfunc -s '`ps -x 2>/dev/null | tail +2 | cut -c1-5`'
fi
+ }
+
+ defcomp wait
+ __wait() {
+ complist -P '%' -j
+ complist -y killfunc -s '`ps -x 2>/dev/null | tail +2 | cut -c1-5`'
}
defcomp cd
--
Sven Wischnowsky wischnow@informatik.hu-berlin.de
next reply other threads:[~1999-01-25 10:40 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-01-25 10:40 Sven Wischnowsky [this message]
1999-01-25 10:57 ` Peter Stephenson
1999-01-25 12:50 ` Andrej Borsenkow
1999-01-26 15:47 Sven Wischnowsky
1999-01-26 18:23 ` Bart Schaefer
1999-01-27 7:51 Sven Wischnowsky
1999-01-28 6:01 ` Bart Schaefer
1999-01-28 9:19 Sven Wischnowsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=199901251040.LAA12723@beta.informatik.hu-berlin.de \
--to=wischnow@informatik.hu-berlin.de \
--cc=zsh-workers@sunsite.auc.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).