2015-11-11 8 views
1

У меня есть следующий за ним рабочий bash_completion кодFetch список значений для auto_complete

_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 

Когда я закладка, я сначала получить список opts, и если я использую один из ОПТС, нажмите вкладку снова, я получаю список arg для этого параметра.

Что я пытаюсь сделать, это предварительно заполнить некоторые из этих аргументов, которые имеют назначенное им значение со списком на выбор. Примеры, на которые я смотрел, где все используют их с верхнего уровня, например, в моем случае, но я хочу использовать его на втором уровне. Я уже пытался реализовать 2-й if внутри цикла case и проверить, например, если $cur является одним из аргументов. Но он никогда не работал, все еще просто печатал полный список на вкладке.

+0

Какова цель '[[ "$ дворняжка" == *]]'? «' * 'соответствует любой строке, включая пустую строку." поэтому этот тест всегда будет успешным. –

+0

'' $ {first} "' может/должно быть "$ first", нет никакой разницы, но позже это canon. –

+0

'[[" $ cur "== *]]' сделает вкладку показом всех доступных аргументов для данной команды. – derchris

ответ

0

Если вы хотите перечислить возможные варианты --arg1 в option1 случае, вы можете проверить, если предыдущее слово (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). 
+0

Спасибо, именно то, что я искал. Я могу использовать это как основу для дальнейшего продвижения вперед. – derchris