我想弄清楚自动完成是如何工作的。我读这complete
以及关于、compgen
和 的整个 bash 参考compopt
,但这并没有告诉我它们如何真正协同工作。
我正在尝试为命令创建自动完成功能,该命令采用动词(来自相当小的集合),后跟现有文件的名称。到目前为止我有这个:
verbs=(upload download delete)
function ac_complete {
printf "COMP_WORDS[%d/%d]: " ${COMP_CWORD} ${#COMP_WORDS[@]}
printf "[%s] " "${COMP_WORDS[@]}"
printf "\n"
if [[ COMP_CWORD -eq 1 ]]
then
COMPREPLY=( "${verbs[@]}" )
else
compopt -o default
fi
}
complete -F ac_complete testit
但这不起作用,我从未见过 bash 完成动词。
- 如何返回可能的完成情况?
- 应该退回什么?只有那些在那时仍然有效的(即,在“d”之后,设置应该是“上传”/“下载”/“删除”还是仅“下载”/“删除”(如果是这样,有一种快速的方法可以应用那个限制?)?
文件的完成工作有效,但我想将其限制为少数文件类型......
答案1
看着那(这bash_完成包作为示例。
生成补全的最常见方法是调用compgen
构建COMPREPLY
数组。找出哪些参数在此特定上下文中有效,然后转换该compgen
调用。内置过滤器参数compgen
不是指定前缀的补全。例如:
COMPREPLY=( $(compgen -W "${verbs[*]}" -- "${COMP_WORDS[COMP_CWORD]}") )
compgen
是计算出要完成的步骤d
,仅download
且delete
有效。
对于文件,使用compgen -G "*.ext"
将完成限制为扩展名为.ext
.这个简单的习惯用法会用空格(或通配符)破坏文件名。这_filedir
函数来自bash_completion
以更稳健的方式处理文件名(仍然会在换行符和通配符上中断):_filedir '*.ext'
.