about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2010-02-13 19:11:12 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2010-02-13 19:11:12 +0000
commitdc09b26c21b67a6ab73d010db77e06ef60b4240d (patch)
tree60b095a6af2f0b99f034f60166e4258971a38b1c
parent35971d292b1a381ddfadf18ffd35c34960a78856 (diff)
downloadzsh-dc09b26c21b67a6ab73d010db77e06ef60b4240d.tar.gz
zsh-dc09b26c21b67a6ab73d010db77e06ef60b4240d.tar.xz
zsh-dc09b26c21b67a6ab73d010db77e06ef60b4240d.zip
Mikael: 27707: glob qualifiers with argument completion
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Zsh/Type/_globquals99
2 files changed, 67 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 1b9137364..43ac03935 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2010-02-13  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* Mikael: Completion/Zsh/Type/_globquals: extend argument
+	handling.
+
 	* Frank: 27705: Completion/Unix/Command/_git: notes
 
 2010-02-12  Peter Stephenson  <pws@csr.com>
@@ -12730,5 +12733,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4895 $
+* $Revision: 1.4896 $
 *****************************************************
diff --git a/Completion/Zsh/Type/_globquals b/Completion/Zsh/Type/_globquals
index 541c45b9d..2cf163fab 100644
--- a/Completion/Zsh/Type/_globquals
+++ b/Completion/Zsh/Type/_globquals
@@ -21,20 +21,32 @@ while [[ -n $PREFIX ]]; do
     (f)
     if ! compset -P "[-=+][0-7?]##"; then
       if [[ -z $PREFIX ]]; then
-	_delimiters qualifier-f
-	return
+        _delimiters qualifier-f
+        return
       elif ! _globqual_delims; then
-	# still completing mode spec
-	_message -e modes "mode spec"
-	return
+        # still completing mode spec
+        _message -e modes "mode spec"
+        return
       fi
     fi
     ;;
 
-    ([eP])
+    (P)
+    # skip delimited prefix
+    if [[ -z $PREFIX ]]; then
+      _delimiters qualifier-P
+      return
+    elif ! _globqual_delims; then
+      # can't suggest anything here
+      _message -e prefix prefix
+      return
+    fi
+    ;;
+
+    (e)
     # complete/skip delimited command line
     if [[ -z $PREFIX ]]; then
-      _delimiters qualifer-$char
+      _delimiters qualifer-e
       return
     elif ! _globqual_delims; then
       # still completing command to eval
@@ -74,12 +86,12 @@ while [[ -n $PREFIX ]]; do
     # complete/skip UID or delimited user
     if ! compset -P '[[:digit:]]##'; then
       if [[ -z $PREFIX ]]; then
-	_delimiters qualifier-u
-	return
+        _delimiters qualifier-u
+        return
       elif ! _globqual_delims; then
-	# still completing user
-	_users -S $delim
-	return
+        # still completing user
+        _users -S $delim
+        return
       fi
     fi
     ;;
@@ -88,12 +100,12 @@ while [[ -n $PREFIX ]]; do
     # complete/skip GID or delimited group
     if ! compset -P '[[:digit:]]##'; then
       if [[ -z $PREFIX ]]; then
-	_delimiter qualifier-g
-	return
+        _delimiter qualifier-g
+        return
       elif ! _globqual_delims; then
-	# still completing group
-	_groups -S $delim
-	return
+        # still completing group
+        _groups -S $delim
+        return
       fi
     fi
     ;;
@@ -103,12 +115,12 @@ while [[ -n $PREFIX ]]; do
       # complete/skip relative time spec
       alts=()
       if ! compset -P '[Mwhms]' && [[ -z $PREFIX ]]; then
-	alts+=(
-	  "time-specifiers:time specifier:\
+        alts+=(
+          "time-specifiers:time specifier:\
 ((M\:months w\:weeks h\:hours m:\minutes s\:seconds))")
       fi
       if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then
-	alts+=("senses:sense:((-\:less\ than +\:more\ than))")
+        alts+=("senses:sense:((-\:less\ than +\:more\ than))")
       fi
       alts+=('digits:digit: ')
       _alternative $alts
@@ -122,12 +134,12 @@ while [[ -n $PREFIX ]]; do
       # complete/skip size spec
       alts=()
       if ! compset -P '[kKmMpP]' && [[ -z $PREFIX ]]; then
-	alts+=(
-	  "size-specifiers:size specifier:\
+        alts+=(
+          "size-specifiers:size specifier:\
 ((k\:kb m\:mb p\:512-byte\ blocks))")
       fi
       if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then
-	alts+=("senses:sense:((-\:less\ than +\:more\ than))")
+        alts+=("senses:sense:((-\:less\ than +\:more\ than))")
       fi
       alts+=('digits:digit: ')
       _alternative $alts
@@ -139,19 +151,34 @@ while [[ -n $PREFIX ]]; do
     # complete/skip sort spec
     if ! compset -P "?"; then
       alts=(
-	"n:lexical order of name"
-	"L:size of file"
-	"l:number of hard links"
-	"a:last access time"
-	"m:last modification time"
-	"c:last inode change time"
-	"d:directory depth"
-	"N:no sorting"
-	"e:execute code"
-	"+:+ command name"
-	)
+        "n:lexical order of name"
+        "L:size of file"
+        "l:number of hard links"
+        "a:last access time"
+        "m:last modification time"
+        "c:last inode change time"
+        "d:directory depth"
+        "N:no sorting"
+        "e:execute code"
+        "+:+ command name"
+        )
       _describe -t sort-specifiers "sort specifier" alts -Q -S ''
       return
+    elif [[ $IPREFIX[-1] = e ]]; then
+      if [[ -z $PREFIX ]]; then
+        _delimiters qualifier-oe
+        return
+      elif ! _globqual_delims; then
+        compset -q
+        _normal
+        return
+      fi
+    elif [[ $IPREFIX[-1] = + ]]; then
+      if [[ $PREFIX = [[:IDENT:]]# ]]; then
+        # either nothing there yet, or still on name
+        _command_names
+        return
+      fi
     fi
     ;;
 
@@ -159,9 +186,9 @@ while [[ -n $PREFIX ]]; do
     # complete/skip range: check for closing bracket
     if ! compset -P "(-|)[[:digit:]]##(,(-|)[[:digit:]]##|)]"; then
       if compset -P "(-|)[[:digit:]]##,"; then
-	_message "end of range"
+        _message "end of range"
       else
-	_message "start of range"
+        _message "start of range"
       fi
       return
     fi