我为命令编写了自动完成函数,但它不是自动完成选项标志后的参数
function _qpdm_complete()
{
local cur prev options my_list
COMPREPLY=()
cur="${COMP_WORD[COMP_CWORD]}"
prev="${COMP_WORD[COMP_CWORD-1]}"
options="-opt"
my_list="quantum alpha betta omega operation"
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -W "${options}" ${cur}) )
return 0
else
COMPREPLY=( $( compgen -W "${my_list}" -- ${cur}) )
fi
}
complete -F _qpdm_complete qpdm
然后在终端
qpdm <TAB>
qpdm -opt
qpdm -opt<TAB>
qpdm -opt
quantum alpha betta omega operation
qpdm -opt o<TAB>
期待
qpdm -opt o
omega operation
但得到
qpdm -opt o
quantum alpha betta omega operation
我的 _qpdm_complete() 中遗漏了什么?
答案1
可能只是一个拼写错误:COMP_WORD
不是 Bash 使用的变量(或者至少我无法在手册中找到它)。你应该写COMP_WORDS
反而。
在您的代码中,cur
和prev
始终为空,因为${COMP_WORD[COMP_CWORD]}
和${COMP_WORD[COMP_CWORD-1]}
引用未定义的变量。并且compgen
,正确地,总是返回与空的 匹配的所有选项值cur
。