最近使用しているコマンドラインプログラムにbash補完サポートを追加しようとしていましたが、壁に衝突したようです。ここでネストされたbash自動補完スクリプト
は、私はオートコンプリート
メインコマンドしたいコマンドとサブコマンドは、自動補完が
process
、サブコマンドversion
のために行われ、help
する必要があり、foo
です。さらにオートコンプリートはサブコマンドによって異なります。ユーザがメインコマンドの後
-
を入力した場合、自動補完はこれらの単語の補完を行います。--activate
または--deactivate
ユーザーが
--deactivate
を入力した場合、それは(のは言わせbashコマンド出力の自動補完を実行する必要がありますls
)。
version
:NOオートコンプリートはprocess
を行わない:ユーザーが-
を入力した場合、ディレクトリを列挙するオートコンプリートのデフォルト(現在の親を含む)- 、オートコンプリートは、これらの単語を補完を行う:
--color
、--verbose
その後停止します。
- 、オートコンプリートは、これらの単語を補完を行う:
ユーザが
help
と入力した場合、オートコンプリートは他のサブコマンド(process
またはversion
)に適用されます。_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" words=("${COMP_WORDS[@]}") cword=$COMP_WORD opts="process version help" case "$prev" in -*) local subopts="--activate --deactivate" COMPREPLY=($(compgen -W "${subopts}" -- ${cur})) case "$cur" in --deactivate) COMPREPLY=($(ls)) ;; esac ;; version) COMPREPLY=() ;; process) case "$cur" in -*) local subopts="--color --verbose" COMPREPLY=($(compgen -W "${subopts}" -- ${cur})) ;; *) COMPREPLY=($(compgen -A directory)) ;; esac ;; help) COMPREPLY=($(compgen -W "process version" -- ${cur})) ;; esac } complete -F _foo foo
おそらく、バッシュは、同様に私の主な得意ではないことがわかります。
は、ここで(ひどく失敗している)自動補完スクリプトの私の現在の実装です。私は各サブコマンドに対して別々のbash関数を書くことを考えていましたが、現時点でどうやってそれを行うのか分かりません。これを実装する方法についてのご提案がありましたら、本当にありがとうございます。
ありがとうございます!