我有一个实用程序,它需要大量不同的参数。现在,我想自动完成第一个参数,但让所有其他参数继续正常自动完成。我怎么做?
function _my_autocomplete_()
{
case $COMP_CWORD in
1) COMPREPLY=($(compgen -W "$(get_args_somehow)" -- ${COMP_WORDS[COMP_CWORD]}));;
*) # What goes here?
esac
}
complete -F _my_autocomplete_ mycommand
答案1
显然我完全错过了你的问题。答案是没有明确定义的“正常自动完成”。但是,如果您知道希望它完成什么类型的事情(文件、别名、pid、变量名等),您可以向compgen
.看这个 compgen 手册页,特别是-A
下面的选项complete
(它们是相同的)。例如,如果您想完成文件名,您可以使用以下命令:
compgen -f -- "${COMP_WORDS[COMP_CWORD]}"
如果你想完成命令(包括别名、函数等),你可以使用这个:
compgen -back -A function -- "${COMP_WORDS[COMP_CWORD]}"
使用$COMP_CWORD
获取正在完成的单词的索引。如果索引不为 1,则设置$COMPREPLY
为()
并返回。
COMP_CWORD
An index into ${COMP_WORDS} of the word containing the current
cursor position. This variable is available only in shell functions
invoked by the programmable completion facilities
答案2
另一个答案是不正确的。compgen -f
接近默认行为,但并不完全相同(尝试自动完成目录名称以查看差异)。
答案# What goes here?
很简单:compopt -o default