This command has an option -o that takes 2 arguments.
That's quite unusual. Are you sure about that?
Usually, you'll either have options that take one argument, or options that act as "flags" and change all other arguments. So you would just check their presence.
"-o" "-old-style" options also aren't as common as "--gnu-style" long options or "-s" short options, so I suggest double-checking.
complete -c command -a "no option completion"
This means to offer "no", "option" and "completion" if the command is "command".
There is no condition specified, so these are always offered.
What you want is to use the "--condition" (or "-n") option to complete
. This takes script (as a string) that is executed. If it returns 0 (i.e. true), the corresponding completion (the rest of that complete
invocation - the option and arguments) is offered.
Something like
# The first condition is just to see that `commandline -opc`,
# which tokenizes (-o) all tokens of the current process (-p)
# up to (but not including) the cursor (-c)
# returns just one token - which must be the command.
#
# Alternatively this condition could also be
# the inverse of the other conditions
# (offer this if nothing else would be)
complete -c command -n 'test (count (commandline -opc)) -lt 2' -a 'stuff for no argument'
# The first argument to the option we handle via "-a" to the option
complete -c command -o the-option -a 'the first argument'
# The second argument needs to be offered
# if the second-to-last token is the option.
#
# This is incomplete, because theoretically a token that
# _looks_ like the option could be offered as an argument to _another_ option.
complete -c command -n 'set -l option (commandline -opc)[-2]; test "$option" = "-o"' -a 'the second argument'