Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: Add new option -s to compdef
- X-seq: zsh-workers 28948
- From: Mikael Magnusson <mikachu@xxxxxxxxx>
- To: zsh workers <zsh-workers@xxxxxxx>
- Subject: PATCH: Add new option -s to compdef
- Date: Mon, 28 Mar 2011 17:12:59 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=GJsLamrTsHzq6xr8OTVmO70iBKJ9VFwTEHRZ3d8JafY=; b=QbjO1U7/Hf/mvTcuuFw7LvRhbRXw8MNphOPn5Fs4ry5yfIbLZ4RhD6g0d86Tw6afId nWMzRRjRGkcPfILhAzcj5eWKAHT4+0kjcLqMwBS1hiim66Vl+CFiF4bXWG3mLZ4mMuMn 5Tetdu/j8sVR0b3jfQiLRAj43aJinFJL6iAJY=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type :content-transfer-encoding; b=V/dRBzU1SZqH9uKB1EErSvRaYBXoU7u7pPc1y4szWqWc0zTffwVXXngOgtbm3YrQbT aFKcnETZOW291t+k617wzpyPssZLCSKqym5N6d0RkXrGXoSQMz/alf9RSI2USPND0iY/ KOrN8y22OQRU78FnVQwJGclSJHPP0VoIv9tnM=
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
I wanted to do this
compdef 'words[1]=./configure;_configure' c m
having read this in the man page
The function argument may alternatively be a string containing any
shell code. The string will be executed using the eval builtin com‐
mand to generate completions.
However, it doesn't work because the name=service check takes
precedence. Thus I came up with the following which lets you simply
say
compdef 'words[1]=./configure;_configure' c m
to override the check
Does "almost any shell code" sound too silly? :)
http://cgit.mika.l3ib.org/cgit/zsh-cvs/commit/?id=63127c2be013
diff --git a/Completion/compinit b/Completion/compinit
index aa42a12..e907114 100644
--- a/Completion/compinit
+++ b/Completion/compinit
@@ -229,7 +229,7 @@ comppostfuncs=()
# delete the definitions for the command names `bar' and `baz'
compdef() {
- local opt autol type func delete new i ret=0 cmd svc
+ local opt autol type func delete shellcode new i ret=0 cmd svc
local -a match mbegin mend
emulate -L zsh
@@ -242,7 +242,7 @@ compdef() {
return 1
fi
- while getopts "anpPkKd" opt; do
+ while getopts "anpPkKds" opt; do
case "$opt" in
a) autol=yes;;
n) new=yes;;
@@ -263,6 +263,7 @@ compdef() {
fi
;;
d) delete=yes;;
+ s) shellcode=yes;;
esac
done
shift OPTIND-1
@@ -276,7 +277,7 @@ compdef() {
# If the first word contains an equal sign, all words must contain one
# and we define which services to use for the commands.
- if [[ "$1" = *\=* ]]; then
+ if [[ -z "$shellcode" ]] && [[ "$1" = *\=* ]]; then
while (( $# )); do
if [[ "$1" = *\=* ]]; then
cmd="${1%%\=*}"
diff --git a/Doc/Zsh/compsys.yo b/Doc/Zsh/compsys.yo
index 28dd5f2..8964eaa 100644
--- a/Doc/Zsh/compsys.yo
+++ b/Doc/Zsh/compsys.yo
@@ -447,7 +447,7 @@ directly.
findex(compdef)
cindex(completion system, adding definitions)
startitem()
-xitem(tt(compdef) [ tt(-an) ] var(function names...) [ tt(-[pP])
var(patterns...) [ tt(-N) var(names...) ] ])
+xitem(tt(compdef) [ tt(-ans) ] var(function names...) [ tt(-[pP])
var(patterns...) [ tt(-N) var(names...) ] ])
xitem(tt(compdef -d) var(names...))
xitem(tt(compdef -k) [ tt(-an) ] var(function style key-sequences...))
item(tt(compdef -K) [ tt(-an) ] var(function name style key-sequences ...))(
@@ -460,10 +460,12 @@ defined by `var(cmd1)tt(=)var(service)' lines in
tt(#compdef) files, as
described above. The argument for var(cmd) will be completed in the
same way as var(service).
-The var(function) argument may alternatively be a string containing any
-shell code. The string will be executed using the tt(eval) builtin
-command to generate completions. This provides a way of avoiding having
-to define a new completion function. For example, to complete
+The var(function) argument may alternatively be a string containing
+almost any shell code. If the string contains an equal sign, the above
+will take precedence. The option -s may be used to specify the first
+argument is shell code. The string will be executed using the tt(eval)
+builtin command to generate completions. This provides a way of avoiding
+having to define a new completion function. For example, to complete
files ending in `tt(.h)' as arguments to the command tt(foo):
example(compdef '_files -g "*.h"' foo)
--
Mikael Magnusson
Messages sorted by:
Reverse Date,
Date,
Thread,
Author