Bash 自动完成

Bash 自动完成

我想弄清楚自动完成是如何工作的。我读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,仅downloaddelete有效。

对于文件,使用compgen -G "*.ext"将完成限制为扩展名为.ext.这个简单的习惯用法会用空格(或通配符)破坏文件名。这_filedir函数来自bash_completion以更稳健的方式处理文件名(仍然会在换行符和通配符上中断):_filedir '*.ext'.

相关内容