获取 auto_complete 的值列表

Fetch list of values for auto_complete

我有以下工作bash_completion代码

 _supdeploy()
{
    local cur prev opts cword
    _init_completion || return

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    first="${COMP_WORDS[1]}"
    opts="option1 option2 --help"

    case "${first}" in
        option1)
            if [[ "$cur" == * ]]; then
               COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
            fi
            return 0
            ;;
        option2)
            if [[ "$cur" == * ]]; then
               COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
            fi
            return 0
            ;;

        *)
            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
            return 0
            ;;
    esac
} &&
complete -F _supdeploy supdeploy

当我按 tab 键时,我首先得到 opts 的列表,如果我使用其中一个选项,再次按 tab 键,我得到这些选项的 arg 列表。

我正在尝试做的是预先填充其中一些参数,这些参数已分配给它们一个列表以供选择。 我查看的示例都在顶层使用这些示例,例如我的案例中的 opts,但我想在第二层使用它。 我已经尝试在 case 循环中实现第二个 if,并检查 $cur 是否是 arg 之一。 但它从来没有用过,仍然只是在选项卡上打印完整列表。

如果你想列出 --arg1option1 情况下的可能选项,你可以检查前一个单词 (prev="{COMP_WORDS[COMP_CWORD-1]}") 是否等于 --arg1:

    case "$first" in
        option1)
            case "$prev" in
              --arg1)
               COMPREPLY=( $( compgen -W 'A Ba Bb C' -- "$cur" ) )
               return 0
               ;;

              --arg2)
               COMPREPLY=( $( compgen -W '11 12 2 3' -- "$cur" ) )
               return 0
               ;;

              *)
                COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
                return 0
                ;;
            esac
            ;;

        option2)

如果检查前一个词不够灵活,你可以实现更复杂的逻辑。来自手册页:

COMP_WORDS
       An array variable (see Arrays below) consisting of the  individ-
       ual  words  in the current command line.  The line is split into
       words as readline  would  split  it,  using  COMP_WORDBREAKS  as
       described above.  This variable is available only in shell func-
       tions invoked by the  programmable  completion  facilities  (see
       Programmable Completion below).