如何将制表符完成添加到带有两个参数的命令(并且制表符完成两个参数)?

How to add tab-completion to command with two arguments (and tab complete both)?

让我们有一个命令command。此命令有一个选项 -o,它接受 2 个参数。我想为这两个参数添加制表符补全。

我试过了

complete -c command -x -s o -a "complete first arg"

我无法向第二个参数添加制表符补全。


我想在未指定选项时自动完成 command。这项工作很好:

complete -c command -a "no option completion"

但是当我在 -o 选项中的第一个参数之后点击制表符时,会显示那些 ^ 补全。

像这样:

command -o "fist" <tab>
no
option
completion

如果我不能为第二个参数添加补全,我想至少删除那些补全。

This command has an option -o that takes 2 arguments.

这很不寻常。你确定吗?

通常,您将拥有采用 一个 参数的选项,或者充当 "flags" 并更改所有其他参数的选项。所以你只需检查他们的存在。

“-o”“-old-style”选项也不像“--gnu-style”长选项或“-s”短选项那么常见,所以我建议仔细检查。

complete -c command -a "no option completion"

这意味着如果命令是 "command",则提供 "no"、"option" 和 "completion"。

没有指定条件,所以这些总是提供。

您想要的是使用 complete 的“--condition”(或“-n”)选项。这需要执行的脚本(作为字符串)。如果它 returns 0(即 true),则提供相应的完成(complete 调用的其余部分 - 选项和参数)。

类似

# 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'