Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Add new option -s to compdef



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