24

私は現在、スクリプトで許可されているコマンドのリスト(「pbt」と呼ばれる)から単一のパラメーターを完了するBash完了ファイルを持っています。これは、機能するBashCompletionファイルです。

_pbt_complete()
{
  local cur goals

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  goals='asadmin clean deploy'
  cur=`echo $cur`
  COMPREPLY=($(compgen -W "${goals}" ${cur}))
}

complete -F _pbt_complete pbt

だから私が電話した場合

pbt <tab>

Bashは、許可されているすべてのコマンド(asadmin、clean、deploy)を完了しますが、これは問題ありません。

ここで、完了に「2番目の」レベルを追加したいと思います。たとえば、私が入力した場合

pbt asadmin <tab>

asadmin内でのみ使用可能なすべてのオプションを完了する必要があります-"environment"(これはbash完了ファイル内でも定義します)、たとえばpbt asadmin [start-domain|stop-domain]

pbt deploy <tab>

たとえば、別のオプションのセットを完了する必要がありますpbt deploy [all|current]。したがって、2番目のコマンドのオプションは、常に最初のコマンドに依存する必要があります。完了ファイルでそれを行うにはどうすればよいですか?

4

2 に答える 2

32

mkb のコメントのおかげで、p4-exampleを調べました。これは、Git の例とは異なり ;) - 自分のケースに適応させるのに十分なほど単純でした。これは私が求めたことを正確に行う作業バージョンです:

have pbt &&
_pbt_complete()
{
  local cur prev

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}

  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $(compgen -W "asadmin deploy" -- $cur) )
  elif [ $COMP_CWORD -eq 2 ]; then
    case "$prev" in
      "asadmin")
        COMPREPLY=( $(compgen -W "start-domain stop-domain" -- $cur) )
        ;;
      "deploy")
        COMPREPLY=( $(compgen -W "all current" -- $cur) )
        ;;
      *)
        ;;
    esac
  fi

  return 0
} &&
complete -F _pbt_complete pbt
于 2011-03-14T19:09:43.717 に答える
2

例として、git の補完がどのように行われるかを見たいと思うかもしれません。(これには、2257 行の関数定義と、私の bash セットアップでの追加の 14 の変数が必要です。)

于 2011-03-14T18:49:27.133 に答える