summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Base/Utility/_arguments17
2 files changed, 19 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9fe8c2bca..c2bb184ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-11-17 Peter Stephenson <pws@csr.com>
+
+ * 26053: Completion/Base/Utility/_arguments: handle
+ "<cmd> --help" output that includes optional parts of options
+ in square brackets.
+
2008-11-15 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 26047: Src/pattern.c, Src/Zle/comp.h, Src/Zle/compmatch.c,
diff --git a/Completion/Base/Utility/_arguments b/Completion/Base/Utility/_arguments
index 21c1541fb..126d9c315 100644
--- a/Completion/Base/Utility/_arguments
+++ b/Completion/Base/Utility/_arguments
@@ -5,7 +5,7 @@
local long cmd="$words[1]" descr odescr mesg subopts opt opt2 usecc autod
local oldcontext="$curcontext" hasopts rawret optarg singopt alwopt
-local setnormarg
+local setnormarg start rest
local -a match mbegin mend
long=$argv[(I)--]
@@ -97,10 +97,19 @@ if (( long )); then
# present. Maybe the problem was that the intervening code
# didn't. If it's buggy without removing them, the problem
# probably is later, not here.
- if [[ -z ${tmp[(r)${match[1]%%[^a-zA-Z0-9_-]#}]} ]]; then
- tmp+=($match[1])
+ start=${match[1]}
+ rest=${match[2]}
+ if [[ -z ${tmp[(r)${start%%[^a-zA-Z0-9_-]#}]} ]]; then
+ # variant syntax seen in fetchmail:
+ # --[fetch]all means --fetchall or --all.
+ # maybe needs to be more general
+ if [[ $start = (#b)(*)\[(*)\](*) ]]; then
+ tmp+=("${match[1]}${match[2]}${match[3]}" "${match[1]}${match[3]}")
+ else
+ tmp+=($start)
+ fi
fi
- opt=$match[2]
+ opt=$rest
done
# If there's left over text, assume it's a description; it
# may be truncated but if it's too long it's no use anyway.