summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Zsh/Context/_brace_parameter3
-rw-r--r--Completion/Zsh/Type/_parameters5
-rw-r--r--Src/Zle/compcore.c14
4 files changed, 28 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index c6099aef5..05200c664 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-28  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 32303: Src/Zle/compcore.c, Completion/Zsh/Type/_parameters,
+	Completion/Zsh/Context/_brace_parameter: allow completion
+	of modifiers for parameters in a fairly simplistic way.
+
 2014-01-28  Peter Stephenson  <p.stephenson@samsung.com>
 
 	* 32308 (slightly modified to use "a" as the vi command at start
diff --git a/Completion/Zsh/Context/_brace_parameter b/Completion/Zsh/Context/_brace_parameter
index c0ecf251b..2aeb12bf4 100644
--- a/Completion/Zsh/Context/_brace_parameter
+++ b/Completion/Zsh/Context/_brace_parameter
@@ -185,6 +185,9 @@ if [[ $PREFIX = *'${('[^\)]# ]]; then
   )
   _describe -t flags "parameter flag" flags -Q -S ''
   return
+elif compset -P '*:'; then
+    _history_modifiers p
+    return
 fi
 
 _parameters -e
diff --git a/Completion/Zsh/Type/_parameters b/Completion/Zsh/Type/_parameters
index 5156e3e2d..eaad3ca9d 100644
--- a/Completion/Zsh/Type/_parameters
+++ b/Completion/Zsh/Type/_parameters
@@ -8,6 +8,11 @@
 
 local expl pattern fakes faked tmp pfilt
 
+if compset -P '*:'; then
+  _history_modifiers p
+  return
+fi
+
 pattern=(-g \*)
 zparseopts -D -K -E g:=pattern
 
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index 5c5628a8d..ac7785ab7 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -1260,6 +1260,20 @@ check_param(char *s, int set, int test)
 	    ispar = (br >= 2 ? 2 : 1);
 	    b[we-wb] = '\0';
 	    return b;
+	} else if (offs > e - s && *e == ':') {
+	    /*
+	     * Guess whether we are in modifiers.
+	     * If the name is followed by a : and the stuff after
+	     * that is either colons or alphanumerics we probably are.
+	     * This is a very rough guess.
+	     */
+	    char *offsptr = s + offs;
+	    for (; e < offsptr; e++) {
+		if (*e != ':' && !ialnum(*e))
+		    break;
+	    }
+	    ispar = (br >= 2 ? 2 : 1);
+	    return NULL;
 	}
     }
     return NULL;