最近使っているコマンドラインプログラムに bash 補完のサポートを追加しようとしているのですが、壁にぶち当たっているようです。
オートコンプリートしたいコマンドとサブコマンドは次のとおりです
メイン コマンドは です。サブコマンド、、および
foo
に対してオートコンプリートを実行する必要があります。それ以降のオートコンプリートは、サブコマンドに依存します。version
process
help
ユーザー
-
がメイン コマンドの後に入力すると、オートコンプリートによって次の単語が補完されます--activate
。--deactivate
ユーザーがを入力
--deactivate
すると、bash コマンド出力のオートコンプリートを実行する必要があります (たとえばls
)。
version
: オートコンプリートは実行されません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 が私の得意分野ではないこともわかるでしょう。サブコマンドごとに個別の bash 関数を作成することを考えていましたが、現時点ではその方法がわかりません。これを実装する方法についても提案があれば、本当に感謝しています。
ありがとう!